在Silverlight用户控件中使用路由事件

时间:2011-04-20 21:39:50

标签: wpf silverlight mvvm user-controls routed-commands

在我当前的项目文件中,我有一个用户控件,该控件具有应用于控件的故事板动画。当在页面中单击按钮时,故事板开始并且基本上在视觉上向用户呈现控件。故事板作为资源驻留在当前页面中

<navigation:Page.Resources>
    <Storyboard x:Name="PreferncesOpen">....</Storyboard x:Name="PreferncesOpen">
        </navigation:Page.Resources>

在页面中,我有一个按钮,我有一个点击事件,启动故事板

private void btnOpenPreferences_Click(object sender, RoutedEventArgs e)
    {
        preferencesPanel.Visibility = System.Windows.Visibility.Visible;
        PreferncesOpen.Begin();
    }

在userControl(preferencesPanel)中,我有一个按钮,单击该按钮需要关闭/折叠用户控件。我计划使用Visibility.collapsed执行此操作。我假设我需要使用路由命令,因为按钮在用户控件内,但是需要在包含控件的页面中调用操作?我仍然是路由命令的新手,我认为这是正确的方法。我只是不确定如何单击用户控件中的按钮并让它修改或执行会影响页面(此控件所在的页面)可能更改的命令,还是该部分影响页面中的其他元素?例如,当在用户控件中单击按钮时,我希望将用户控件的可见性设置为折叠。我还希望主页面中的一个网格列的宽度重新调整大小。我过去使用页面后面的代码完成了这个,但我试图将其中的一些分开,我认为路由命令将是要走的路? 我非常感谢任何提示。

提前谢谢

1 个答案:

答案 0 :(得分:0)

标题有点误导,如果我理解正确的话,你会询问命令而不是路由事件。

以下是使用Prism库中的DelegateCommand<T>的示例;这恰好是我个人的偏好。

加价:

<Button x:Name="MyButton" Content="Btn" Command="{Binding DoSomethingCommand}"/>

代码隐藏*或ViewModel:

(*如果你没有使用MVVM,请确保添加MyButton.DataContext = this;,这样你就可以确定按钮可以有效地数据绑定到你的代码中了)

public DelegateCommand<object> DoSomethingCommand
{
    get 
    { 
        if(mDoSomethingCommand == null)
            mDoSomethingCommand = new DelegateCommand(DoSomething, canDoSomething);
        return mDoSomethingCommand;
    }

private DelegateCommand<object> mDoSomethingCommand;

// here's where the command is actually executed
void DoSomething(object o)
{}

// here's where the check is made whether the command can actually be executed
// insert your own condition here
bool canDoSomething(object o)
{ return true; }


// here's how you can force the command to check whether it can be executed
// typically a reaction for a PropertyChanged event or whatever you like
DoSomethingCommand.RaiseCanExecuteChanged();

传递给上述函数的参数是CommandParameter依赖属性(在Prism中它是一个附加属性,如果内存为我提供了正确的命令属性)。 设置后,您可以将您选择的值传递给您希望执行的命令。

希望有所帮助。