【问题标题】:Enable command binding for TextBlock为 TextBlock 启用命令绑定
【发布时间】:2009-11-24 13:12:32
【问题描述】:

我正在开发一个 WPF 应用程序,并且有一个 TextBlock,我想在单击时使用命令绑定来触发命令。实现这一目标的最佳方法是什么?

  • TextBlock 控件没有 Command 属性,但它有 CommandManager。这是什么?它可以用于命令绑定吗?我已经看到了许多其他控件以及此属性..

  • 是否有一些我监督的可以使用的控件?是不是例如建议使用按钮并将其样式设置为看起来不像按钮?

  • 是否有一些支持命令绑定的控件,我可以将它们包裹在 TextBlock 周围?

  • 我是否应该创建一个自定义控件,它基本上是一个 TextBlock,但具有额外的属性 Command 和 CommandArgument,可以启用命令绑定,例如MouseLeftButtonDown 属性。

【问题讨论】:

    标签: .net wpf command commandbinding


    【解决方案1】:

    是否有一些我监督的可以使用的控制?是不是例如建议使用按钮并将其样式设置为不像按钮?

    是的。最简单的方法是将按钮重新模板化,使其像 TextBlock 一样工作,并利用按钮类的 command 属性。

    类似这样的:

    <ControlTemplate TargetType="Button">
            <TextBlock Text="{TemplateBinding Content}" />
        </ControlTemplate>
    ...
    <Button Content="Foo" Command="{Binding Bar}" />
    

    【讨论】:

    • 谢谢。像预期的那样工作 - 它实际上非常整洁..!我现在已经阅读了“WPF Unleased”中的 ControlTemplates,感觉不错。 "Text="{TemplateBinding Content}" " 到底有什么作用?将我设置到按钮 Content 属性的内容绑定到 TextBlock 上的 Text 属性?
    • 是的,这正是它的作用。
    【解决方案2】:

    下面的 XAML 可用于将命令绑定添加到 WPF 文本块,然后该文本块将作用于鼠标操作。

    <TextBlock FontWeight="Bold" Text="Header" Cursor="Hand">
        <TextBlock.InputBindings>
            <MouseBinding Command="ApplicationCommands.Cut" MouseAction="LeftClick"/>
        </TextBlock.InputBindings>
    </TextBlock>
    

    Command 可以是内置应用程序命令之一,它使用如上所示的语法,也可以是继承自 ICommand 接口的自定义 Command。在这种情况下,语法将是:

    <MouseBinding Command="{Binding myCustomCommand}" MouseAction="LeftClick"/>
    

    MouseAction 没有提供关于在其中放置什么的任何 Intellisense 提示(在 VS2015 中),因此您必须进行一些挖掘才能获得有效的枚举。

    从 .NET 4.5 开始,MouseAction 的有效条目为:

    • LeftClick - 单击鼠标左键。
    • LeftDoubleClick - 鼠标左键双击。
    • MiddleClick - 单击鼠标中键。
    • MiddleDoubleClick - 鼠标中键双击。
    • 无 - 无操作。
    • RightClick - 单击鼠标右键。
    • RightDoubleClick - 鼠标右键双击。
    • WheelClick - 鼠标滚轮旋转。

    上面显示的常量取自MSDN

    【讨论】:

    • 虽然这段代码可能会回答这个问题,但最好在不介绍其他人的情况下解释如何它解决问题以及为什么要使用它。从长远来看,纯代码的答案没有用处。
    • 感谢@BenjaminW 的建议。这是我在社区的第一个答案:-)
    • @Praveen,很好的答案。这正是我所需要的。我编辑了您的答案以包含更多描述和使用提示。
    【解决方案3】:
    <Window.Resources>
    <CommandBinding x:Key="binding" Command="ApplicationCommands.Save" Executed="SaveCommand" CanExecute="SaveCommand_CanExecute" />
    </Window.Resources>
    
    
    <TextBox Margin="5" Grid.Row="2" TextWrapping="Wrap" AcceptsReturn="True" TextChanged="txt_TextChanged">
    <TextBox.CommandBindings>
    <StaticResource ResourceKey="binding"></StaticResource>
    </TextBox.CommandBindings>
    </TextBox>
    

    你见过http://www.java2s.com/Tutorial/CSharp/0470__Windows-Presentation-Foundation/BindTextBoxsavecommandtoCommandBinding.htm

    【讨论】:

    • 请解释这个答案如何解决这个问题
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-25
    • 2014-08-25
    • 1970-01-01
    • 2013-04-04
    相关资源
    最近更新 更多