gpt4 book ai didi

c# - 在 XAML 中设置命令目标

转载 作者:太空狗 更新时间:2023-10-29 21:20:47 26 4
gpt4 key购买 nike

我很难理解 RoutedCommand 的 CommandTarget 属性。

基本上,我有一些在用户控件(而不是窗口)中实现的静态命令。我在用户控件中创建了一个命令绑定(bind)。如果我在用户控件中声明按钮,那么我就可以使用我的路由事件。但是,当按钮在用户控件之外时,我无法使用我的路由事件。我认为命令目标将解决我的问题。

那么如何为工具栏用户控件的按钮设置commandtarget,从而调用Container的Executed和CanExecuted呢?

使用 micahtan 更改的更改编辑代码,但我仍然无法将其获取到 CanExecute 或 Execute。

窗口 XAML:

<Window x:Class="RoutedCommands.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:RoutedCommands"
xmlns:toolbar="clr-namespace:RoutedCommands.Toolbar"
Title="Window1" Height="300" Width="300">
<StackPanel>
<local:Container Width="100" Height="25" x:Name="MyContainer" />
<toolbar:Toolbar Width="100" Height="25" CommandTarget="{Binding MyContainer}" />
</StackPanel>
</Window>

工具栏 XAML:

<UserControl x:Class="RoutedCommands.Toolbar.Toolbar"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:RoutedCommands"
x:Name="MyToolbar"
Height="300" Width="300">
<Grid>
<Button Command="{x:Static local:Commands.MyCommand}" Content="Try Me" CommandTarget="{Binding ElementName=MyToolbar, Path=CommandTarget, Mode=OneWay}" />
</Grid>
</UserControl>

工具栏 CS:

    public partial class Toolbar : UserControl
{
public Toolbar()
{
InitializeComponent();
}

// Using a DependencyProperty as the backing store for CommandTarget. This enables animation, styling, binding, etc...
public static readonly DependencyProperty CommandTargetProperty =
DependencyProperty.Register("CommandTarget", typeof(IInputElement), typeof(Toolbar), new UIPropertyMetadata(null));

public IInputElement CommandTarget
{
get { return (IInputElement)GetValue(CommandTargetProperty); }
set { SetValue(CommandTargetProperty, value); }
}
}

容器 XAML:

<UserControl x:Class="RoutedCommands.Container"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:RoutedCommands"
Height="300" Width="300">
<UserControl.CommandBindings>
<CommandBinding Command="{x:Static local:Commands.MyCommand}" CanExecute="CommandBinding_CanExecute" Executed="CommandBinding_Executed" />
</UserControl.CommandBindings>
<Grid>
<Button Command="{x:Static local:Commands.MyCommand}" Content="Click Me" />
</Grid>
</UserControl>

容器CS:

public partial class Container : UserControl
{
public Container()
{
InitializeComponent();
}

private void CommandBinding_Executed(object sender, ExecutedRoutedEventArgs e)
{
Console.WriteLine("My Command Executed");
}

private void CommandBinding_CanExecute(object sender, CanExecuteRoutedEventArgs e)
{
Console.WriteLine("My Command Can Execute");
e.CanExecute = true;
}
}

路由命令:

namespace RoutedCommands
{
public static class Commands
{
public static readonly RoutedUICommand MyCommand = new RoutedUICommand();
}
}

最佳答案

如果您想使用 CommandTargets,我会在您的自定义 UserControl 上创建一个 CommandTarget DependencyProperty,类似于它在 ButtonBase 上的定义方式。

完成之后,将 Button 的 CommandTarget 设置为自定义 UserControl 的 CommandTarget。

编辑:代码示例

如果您正在执行 MVVM 架构,Rudi 的评论是有效的——在这种情况下,RelayCommands 或其他形式的包装委托(delegate)可以很好地工作。根据您的代码示例,您似乎没有使用那种方法,因此我发表了最初的评论。

至于代码,您只需要更改您的 ToolBar 类即可。这假定您的 MyCommand 类继承自 RoutedUICommand。这是 XAML:

<UserControl
x:Class="WPFCommandTarget.CustomToolBar"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:WPFCommandTarget"
x:Name="theControl">
<Grid>
<Button
x:Name="theButton"
Command="{x:Static local:Commands.MyCommand}"
CommandTarget="{Binding ElementName=theControl, Path=CommandTarget, Mode=OneWay}"
Content="Try Me" />
</Grid>
</UserControl>

这是代码隐藏:

使用 System.Windows;使用 System.Windows.Controls;

namespace WPFCommandTarget
{
/// <summary>
/// Interaction logic for CustomToolBar.xaml
/// </summary>
public partial class CustomToolBar : UserControl
{
public CustomToolBar()
{
InitializeComponent();
}

public IInputElement CommandTarget
{
get { return (IInputElement)GetValue(CommandTargetProperty); }
set { SetValue(CommandTargetProperty, value); }
}

// Using a DependencyProperty as the backing store for CommandTarget. This enables animation, styling, binding, etc...
public static readonly DependencyProperty CommandTargetProperty =
DependencyProperty.Register("CommandTarget", typeof(IInputElement), typeof(CustomToolBar), new UIPropertyMetadata(null));
}
}

请注意,我已经更改了我的测试项目中的一些类名/命名空间。您必须更改它们以满足您的需要。

关于c# - 在 XAML 中设置命令目标,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1015851/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com