【发布时间】:2020-07-24 14:28:52
【问题描述】:
研究模板时,我对如何获取单击此或那个模板按钮的事件很感兴趣。以简单模板为例:
<Window.Resources>
<ControlTemplate x:Key="ControlTemplateKey" TargetType="{x:Type ContentControl}">
<StackPanel>
<TextBlock Text="TextBlock 01" />
<Button Content="Button 01" />
<Button Content="Button 02" />
</StackPanel>
</ControlTemplate>
</Window.Resources>
<ContentControl x:Name="ContentControlName" Template="{StaticResource ControlTemplateKey}" />
为了确定点击一个或另一个元素(在本例中为按钮),我遍历树的内容:
ContentControlName.PreviewMouseDown += (s, e) =>
{
DependencyObject i = VisualTreeHelper.HitTest(s as Visual, Mouse.GetPosition(s as IInputElement)).VisualHit;
while (i != null)
{
if (i is Button)
{
Console.WriteLine((i as Button).Content);
break;
}
i = VisualTreeHelper.GetParent(i);
}
};
但是,我认为有一种专门针对此的更简单的方法,而不是我在树上的迭代。如何更轻松地识别模板中按下的按钮?谢谢
【问题讨论】:
-
点击按钮会发生什么?你真的不需要 hit tests 按钮。它们已经支持命令,您可以将其绑定到
ICommand属性。 -
谢谢。当你按下这个或那个按钮时,会出现一个特定的代码。 Sinatr,你的意思是这样的c-sharpcorner.com/UploadFile/e06010/wpf-icommand-in-mvvm?
-
你用这样的模板做什么?比方说你如何为一个ContentControl实例定义Text = "TextBlock 01" 值。还是它们都一样?通常,元素的数据提供者是 DataContext,并且通过绑定从中检索数据。例如 Text = "{Binding Text01}"。因此,最正确的方法是使用@Sinatr 所写的命令。
-
是的,这是一个正确的说法,我没有在问题中指出模板重复使用不同的元素属性,这些属性是通过Binding设置的。我专注于事件。我从 EldHasp 那里得到了很好的回答——通过 Command 访问。