我想发起一个绑定命令,但我不想在Button
上使用UserControl
。实际上,UserControl
本身就是Button
。当它在表面上的任何地方被点击时,我想发起一个绑定命令。有没有办法给UserControl
一个命令?
在旁注中:一个控件的一个命令和几个开箱即用的控件?这一切似乎有点笨重。我开始认为MVVM是不切实际的。我可以使用Interfaces和OOP将我的UI解耦得很好。无论如何,我仍然有希望。
此外,我不愿意破解任何东西或使用昂贵的解决方法。如果我不能这样做,我就放弃了MVVM。
答案 0 :(得分:4)
如果您的UserControl本质上是一个Button,为什么要编写自己的UserControl而不是使用Button类?
要添加更多信息,请执行以下操作:
public class MyCoolButton : Button { }
MyCoolButton
的样式 - 不要将样式命名为适用于所有MyCoolButtons 答案 1 :(得分:4)
在这里查看ICommandSource界面:http://msdn.microsoft.com/en-us/library/system.windows.input.icommandsource.aspx。如果您希望控件具有命令,则您的控件应实现此接口。实现此接口的控件示例是ButtonBase和MenuItem。希望这会有所帮助。
答案 2 :(得分:1)
我同意保罗贝茨的意见。
我经常创建自己的ListBoxItemContainerStyle,使用按钮作为顶部容器,其中只有一个无属性内容展示器。这允许我使用按钮功能(如Command),而不使用Windows Chrome。
将它放在ListBoxItemContainerStyle中也允许我这样做,以便在单击它时不显示正常的虚线边框(FocusVisualStyle = {x:Null})。
您使用Visual Studio或Expression Blend进行样式设计吗?
此外,一些MVVM框架提供了一个接口,用于为除按钮之外的控件添加命令功能。 Caliburn拥有非常丰富的命令模式。但是,我不确定它是否允许在非按钮控件上绑定命令。
答案 3 :(得分:1)
OP询问了如何使用按钮控件的示例,但内容正确填充整个按钮。您可以使用ContentAlignment属性执行此操作:
<Button HorizontalContentAlignment="Stretch" VerticalContentAlignment="Stretch">
<Button.Content>
<Grid IsHitTestVisible="False">
<Grid.RowDefinitions>
<RowDefinition Height="30" />
<RowDefinition Height="*" />
</Grid.RowDefinitions>
<TextBlock Grid.Row="0" Text="Row0" />
<TextBlock Grid.Row="1" Text="Row1" />
</Grid>
</Button.Content>
</Button>
这将创建一个按钮,其中两个标签使用网格控件间隔开。我将Grid标记为关闭HitTestVisible,因为您必须决定哪些控件应该像按钮一样进行交互,哪些控件应该像控件一样进行交互。例如,您可能有一个嵌入式TextBox,您想要在不单击按钮的情况下进行单击,在这种情况下,它应该具有HitTestVisible = True。
答案 4 :(得分:0)
WPF支持图层和透明度:
Panel.ZIndex
您可以创建任何支持在高级透明图层上指定所需尺寸的内容,以充当按钮。