如何在Windows Phone 8中使用命令处理UserControl的OnClick命令

本文关键字:命令 处理 UserControl OnClick Windows Phone | 更新日期: 2023-09-27 18:32:14

我想在实现UserControl的页面中处理一些Button.Click事件。

UserControl如下所示:

<UserControl>
    <Grid x:Name="LayoutRoot" Background="Transparent">
        <Button Command="{Binding ButtonClickedCommand, Source={RelativeSource Self}}" />
    </Grid>
</UserControl>

和背后的代码:

public partial class MapUserControl : UserControl
{
    public MapTabBar()
    {
        InitializeComponent();
    }
    public ICommand ButtonClickedCommand
    {
        get { return (ICommand)GetValue(ButtonClickedCommandProperty); }
        set { SetValue(ButtonClickedCommandProperty, value); }
    }
    public static readonly DependencyProperty ButtonClickedCommandProperty = DependencyProperty.Register(
        "ButtonClickedCommandProperty", 
        typeof(ICommand), 
        typeof(MapTabBar), 
        new PropertyMetadata(null));
}

我在MainPage.xaml:中使用这个UserControl

<Grid x:Name="LayoutRoot" Background="Transparent">
    <maps:Map x:Name="Map" ZoomLevel="7" />
    <local:MapUserControl
        ButtonClickedCommand="{Binding ???}" />
</Grid>

如何将此ButtonClickedCommand绑定到MainPage.xaml.cs中的函数:

    protected void Button_Clicked()
    {
        MessageBox.Show("button clicked");
    }

最终,我想在我的主页中操作地图(居中,过滤,重新加载)。这是正确的方法,还是有其他方法?

如何在Windows Phone 8中使用命令处理UserControl的OnClick命令

在用户控件中尝试以下操作

<!-- xaml -->
<Button Click="OnButtonClicked"/>

// Code behind
private void OnButtonClicked(object sender, RoutedEventArgs routedEventArgs)
{
    if(ButtonClickedCommand != null)
    {
        ButtonClickedCommand.Execute(null);
    }
}

另一种解决方案是允许地图工具控制地图本身。您需要在地图工具对象上设置 DP(旁注:最好创建自定义控件而不是 USerControl)。

// MapTools
public Map Map
{
    get { return (Map)GetValue(MapProperty); }
    set { SetValue(MapProperty, value); }
}
public static readonly DependencyProperty MapProperty =
    DependencyProperty.Register(
    "Map", 
    typeof(Map), 
    typeof(MapTools), 
    new PropertyMetadata(null));
private void OnButtonClicked(object sender, RoutedEventArgs routedEventArgs)
{
    // Manipulate map
}

然后在使用它的页面中

<Grid>
    <maps:Map x:Name="MyMap"'>
    <mytools:MapTools Map="{Binding ElementName=MyMap}"/>
</Grid>

如果您想要的只是注册主页的功能,而没有从视图绑定命令的能力模型,我认为您使用命令没有任何用处,只需使用事件:

在用户控件中定义:

public event RoutedEventHandler ButtonClicked;
    private void MyButtonClicked(object sender, RoutedEventArgs e)
    {
        if (ButtonClicked != null)
        {
            ButtonClicked(sender, e);
        }
    }

然后在您的主页上,只需像这样使用它:

    <local:MapUserControl ButtonClicked="Button_Clicked"/>

MainPage.xaml,我正在绑定登录用户控件通过使用命名空间:xmlns:UC="clr-namespace:Test.Views",因为我的用户控件位于名为"视图"的文件夹中。

<ScrollViewer>
<UC:Login BtnLoginClick="Login_BtnLoginClick"/>
</ScrollViewer>

登录.cs

public partial class Login : UserControl    {
    public event EventHandler BtnLoginClick;
    public Login()
    {
        InitializeComponent();
    }
    private void btnLogin_Click(object sender, RoutedEventArgs e)
    {
        string userName = txtUserName.Text;
        string userPassword = txtUserPassword.Password.Trim();
        if (userName != null && userName != string.Empty && userPassword != null &&       userPassword != string.Empty)
        {
            if (this.BtnLoginClick != null)
            {
                this.BtnLoginClick(this, e);
            }
        }
        else
        {
            MessageBox.Show("Invalid username or password");
        }
    }

}

最后,不要忘记使用 MainPage.xaml 中的事件处理程序从登录用户控件捕获按钮单击的事件以执行其他操作。

MainPage.xaml

<UC:Login BtnLoginClick="Login_BtnLoginClick"/>

这里的"BtnLoginClick"是在Login.xaml[User Control]中定义的事件处理程序。

为这个"BtnLoginClick"事件创建新事件,就像我创建"Login_BtnLoginClick"一样。

主页.cs

private void Login_BtnLoginClick(object sender, EventArgs e)
{
Messagebox.Show("Event captured successfully");
////Here you can add your stuffs...     
}