如何使用Caliburn.Micro选择TextBox中的所有文本?

问题描述 投票:0回答:2

在我的WPF应用程序中,我使用Caliburn.Micro在View和ViewModel之间进行绑定。

在我的视图中,我有StackPanel文本框

<StackPanel>
    <TextBox x:Name="Ctx_A" />
    <TextBox x:Name="Ctx_B" />
    <TextBox x:Name="Ctx_C" />
    <TextBox x:Name="Ctx_D" />
</StackPanel>

现在我想在关注TextBox之后选择所有文本。在我的ViewModel中,我编写方法TextBox GotFocus

public void TextBoxGotFocus(object sender)
{
  var tb = sender as TextBox;
  if (tb != null)
  {
    tb.SelectAll();
  }
}

接下来我回到我的视图并写下这样的东西:

<StackPanel>
    <TextBox x:Name="Ctx_A" cal:Message.Attach=" [Event GotFocus]=[Action TextBoxGotFocus($source)]"/>
    <TextBox x:Name="Ctx_B" cal:Message.Attach=" [Event GotFocus]=[Action TextBoxGotFocus($source)]"/>
    <TextBox x:Name="Ctx_C" cal:Message.Attach=" [Event GotFocus]=[Action TextBoxGotFocus($source)]"/>
    <TextBox x:Name="Ctx_D" cal:Message.Attach=" [Event GotFocus]=[Action TextBoxGotFocus($source)]"/>
</StackPanel>

有没有可能将此方法附加到StackPanel而不是TextBox?

c# wpf caliburn.micro
2个回答
1
投票

我会从您的视图模型中删除TextBoxGotFocus()方法,因为它会模糊视图和视图模型之间的线条。视图模型不应使用其中的任何WPF控件。相反,我能想到的最简单的方法是创建一个继承自TextBox的类,然后将事件附加到该类:

public class AutofocusTextBox : TextBox
{
    public AutofocusTextBox()
    {
        GotFocus += (sender, e) => SelectAll();
    }
}

然后在你的XAML中,你可以像这样使用它:

<local:AutofocusTextBox ... />

这将使您的XAML更加清洁


0
投票

所有信用都归WPF博士... Source

在abcView.xaml中

<TextBox    Text="{Binding Amount}" 
            MinWidth="100" 
            cal:Message.Attach="[Event GotFocus] = [Action GotFocusMethod($source)];
            [Event PreviewMouseLeftButtonDown] = [Action SelectivelyIgnoreMouseButton($source, $eventArgs)]" />

在abcViewModel.cs中

    // called by ui... used to highlight a textbox on focus
    public void GotFocusMethod(object source)
    {
        var based = source as TextBox;
        based.SelectAll();
    } // close gotfocusmethod

    // called by ui... used to highlight a textbox on focus
    public void SelectivelyIgnoreMouseButton(object sender, MouseButtonEventArgs eve)
    {
        TextBox tb = (sender as TextBox);

        if (tb != null)
        {
            if (!tb.IsKeyboardFocusWithin)
            {
                eve.Handled = true;

                tb.Focus();
            }
        }
    } // close selectivelyignoremousebutton()
© www.soinside.com 2019 - 2024. All rights reserved.