在我开始之前,这是一个小背景。我开始在WPF中创建我的应用程序,就像我以前在WinForms中编程一样。显然,这完全绕过了WPF的优势。所以现在我已经阅读了更多关于WPF和MVVM框架的内容,我开始调整我的应用程序以模型 - 视图 - ViewModel方式工作。
事先,我曾经使用Window的代码隐藏,只是处理了MouseDown RoutedEvents然后继续并提示一个签名窗口。我的DockPanel和Image似乎没有Command
。
我怎样才能以MVVM的方式做到这一点? RoutedEvents是解决这种情况的方法吗?
答案 0 :(得分:5)
不要使用Behaviors和stuff复杂整个事物,而是将所有UI元素放在Button的ControlTemplate中并使用它的命令:
<Button Command="{Binding YourCommand}">
<Button.Template>
<ControlTemplate TargetType="Button">
<DockPanel>
<Image/>
<!-- Whatever -->
</DockPanel>
</ControlTemplate>
</Button.Template>
</Button>
答案 1 :(得分:1)
您可以使用Blend SDK附带的互动触发器。
步骤 -
System.Windows.Interactivity
的引用。在XAML文件中添加相应的命名空间
xmlns:interactivity="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity"
您可以像使用它一样使用它 -
<StackPanel>
<interactivity:Interaction.Triggers>
<interactivity:EventTrigger EventName="MouseDown">
<interactivity:InvokeCommandAction Command="{Binding CloseCommand}"/>
</interactivity:EventTrigger>
</interactivity:Interaction.Triggers>
</StackPanel>
这里的CloseCommand在你的ViewModel类中。
答案 2 :(得分:1)
对于工具图片,请点击:
在我的示例中,我评估了点击次数,因为我不知道如何做得更好
public class ImageHelper : Image
{
public static readonly RoutedEvent MouseLeftButtonClick =
EventManager.RegisterRoutedEvent(
"MouseLeftButtonClick",
RoutingStrategy.Bubble,
typeof(RoutedEventHandler),
typeof(ImageHelper));
public event RoutedEventHandler MouseLeftButtonClickEvent
{
add
{
AddHandler(MouseLeftButtonClick, value);
}
remove
{
RemoveHandler(MouseLeftButtonClick, value);
}
}
protected override void OnMouseLeftButtonDown(MouseButtonEventArgs e)
{
if (e.ClickCount == 1)
{
RaiseEvent(new MouseLeftButtonClickEventArgs(
MouseLeftButtonClick, this));
}
base.OnMouseLeftButtonDown(e);
}
public class MouseLeftButtonClickEventArgs : RoutedEventArgs
{
public MouseLeftButtonClickEventArgs(RoutedEvent routedEvent, object source)
: base(routedEvent, source)
{
// some code.....
}
}
}
XAML:
<local:ImageHelper>
<i:Interaction.Triggers>
<i:EventTrigger EventName="MouseLeftButtonClickEvent">
<i:InvokeCommandAction Command="{Binding Path=MyCommand}" />
</i:EventTrigger>
</i:Interaction.Triggers>
</local:ImageHelper>