我有一个非常简单的示例代码,一个TextBox和一个Button。用户在textBox中输入一些文本,然后单击按钮。它应该显示一个公共MessageBox,其中包含他刚刚在TextBox中输入的文本。
问题:MessageBox显示空白!经过一些反复试验,我发现了原因。我将.xaml中的Focusable of Button设置为false。为什么?因为我想在点击一次后停止按钮的闪烁效果。
所以我有个主意。我将Focusable绑定到ViewModel中的属性,并在ViewModel的构造函数(或私有字段中作为初始值)初始化为false。然后在显示MessageBox之前的Button-Click事件处理程序中,我将属性设置为true,然后在执行MessageBox之后再次将其设置为false。 问题:不幸的是,它不起作用!似乎Focusable只能在构造函数或私有字段中设置一次作为初始值。
有人知道如何解决这个问题吗?我想保持按钮的Focusable为假(以避免按钮闪烁),我想通过单击按钮从TextBox获取文本。以下是示例代码,随时修改并向我展示解决方案。提前谢谢。
XAML / View
<Grid Width="300" Height="300">
<StackPanel VerticalAlignment="Center">
<TextBox Width="150" Text="{Binding Path=MyText}" />
<Button x:Name="ShowText"
Width="100"
Content="Show Text"
Focusable="{Binding Path=MyFocus}" />
</StackPanel>
</Grid>
查看模型
public class ShellViewModel : PropertyChangedBase
{
private String _myText;
public String MyText
{
get { return _myText; }
set
{
_myText = value;
NotifyOfPropertyChange(() => MyText);
}
}
private Boolean _myFocus = false; // if it is true, the MessageBox can show MyText, otherwise MessageBox shows blank
public Boolean MyFocus
{
get { return _myFocus; }
set
{
_myFocus = value;
NotifyOfPropertyChange(() => MyFocus);
}
}
public void ShowText()
{
//MyFocus = true; // this doesn't work
MessageBox.Show(MyText);
//MyFocus = false; // this doesn't work
}
}
答案 0 :(得分:1)
<Grid Width="300" Height="300">
<StackPanel VerticalAlignment="Center">
<TextBox Width="150" Text="{Binding MyText, Mode=TwoWay}" />
<Button x:Name="ShowText"
Width="100"
Content="Show Text"
Focusable="{Binding MyFocus}" />
</StackPanel>
</Grid>
或
<Grid Width="300" Height="300">
<StackPanel VerticalAlignment="Center">
<TextBox Width="150" x:Name="MyText" />
<Button x:Name="ShowText"
Width="100"
Content="Show Text"
Focusable="{Binding MyFocus}" />
</StackPanel>
</Grid>
应该以任何一种方式工作,你进行绑定的方式不会更新底层属性,因为它不被认为是双向的。因此,在第一个版本上需要Mode = TwoWay,第二个版本使用CM的约定来查找文本框并将其绑定到viewmodel上的同名属性。
不确定你指向默认样式的闪烁没有闪烁...至少在Windows 8.1或Windows 10上没有。关于你所做的代码碎片,唯一可以关注的是阻止键盘访问..