繁体   English   中英

WPF从窗口中的框架导航到Usercontrol并将参数传递给它

[英]WPF Navigate from frame in window to Usercontrol and pass parameters to it

我在WPF / C#应用程序中有一个现代窗口,在其中添加了现代框架:

<mui:ModernWindow x:Class="MyApp.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:mui="http://firstfloorsoftware.com/ModernUI"
    WindowStartupLocation="CenterScreen"
    Style="{StaticResource EmptyWindow}">

<Window.Resources>
</Window.Resources>
<Grid>
<Menu x:Name="menu" Height="62" VerticalAlignment="Top" >
        <MenuItem x:Name="miHome" Header="Home" Click="MenuItem_Home" IsChecked="True" Width="60" FontSize="14" />
        <MenuItem x:Name="miClients" Header="Clients"  FontSize="14" Click="MenuItem_Clients" Width="65"/>
        <MenuItem x:Name="miSuppliers" Header="Suppliers" FontSize="14"  Click="MenuItem_Suppliers" Width="81"/>
        <MenuItem x:Name="miReports" Header="Reports" FontSize="14"  Click="MenuItem_Reporting" Width="71"/>
    </Menu>
    <mui:ModernFrame Margin="0,75,10,10" x:Name="frame">

    </mui:ModernFrame>
</Grid>

我的应用程序中有MenuItems,当我单击Suppliers项目时,我使用用户控件填充框架,如下所示:

frame.Source = new Uri("/Pages/Suppliers.xaml", UriKind.Relative);

其中Suppliers.xaml设计为:

<UserControl
             x:Class="MyApp.LinksBar.Suppliers"
             xmlns:MyApp="clr-namespace:MyApp" 
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             xmlns:mui="http://firstfloorsoftware.com/ModernUI"  
             mc:Ignorable="d" 
             d:DesignHeight="575" d:DesignWidth="905">
    <UserControl.Resources>
    </UserControl.Resources>
    <Grid  Name="Grid">
        <mui:ModernButton x:Name="btnmakePayment" Content="Make Payment" Click="btnMakePayment_Click" Grid.Row="2" HorizontalAlignment="Right" VerticalAlignment="Top"/>
    </Grid>
</UserControl>

当我点击“付款”按钮时,我导航到另一个UserControl(MakePayment.xaml):

private void btnMakePayment_Click(object sender, RoutedEventArgs e)
{
    NavigationCommands.GoToPage.Execute(new Uri("/Actions/MakePayment.xaml", UriKind.Relative), this);
}

MakePayment.xaml设计为:

<UserControl
             xmlns:local="clr-namespace:MyApp.Actions" x:Class="MyApp.Actions.MakePayment" 
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             xmlns:mui="http://firstfloorsoftware.com/ModernUI" xmlns:System="clr-namespace:System;assembly=mscorlib" xmlns:MyApp="clr-namespace:MyApp" 
             mc:Ignorable="d"
             Loaded="MakePayment_Loaded"
             d:DesignHeight="600" d:DesignWidth="866" >
    <UserControl.Resources>
    </UserControl.Resources>
    <Grid DataContext="{StaticResource makePaymentViewSource}" Name="Grid">
        <Grid.RowDefinitions>
        </Grid.RowDefinitions>
    <Label Content="Total"  VerticalContentAlignment="Center" HorizontalAlignment="Left" VerticalAlignment="Top"/>
    // More design code here ...
    </Grid>
</UserControl>

我的问题来了:我需要将参数从Suppliers UserControl传递到MakePayment UserControl 如何以编程方式在Suppliers中传递参数并在MakePayment中读取它们?

谢谢。

如果您可以将一个绑定到另一个,那就应该这样做。 到目前为止,使两个UserControl进行“通信”(或共享可以共同使用的属性)的最简单方法是在每个UserControl上定义一个DependencyProperty并将它们双向绑定。

这样,双方总是可以访问相同的值,并且都可以使用该值。

以我自己的控制为例:

<UserControl x:Class="MyControls.MasterContainerControl"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
            xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
            xmlns:local="clr-namespace:MyControls"
            mc:Ignorable="d"
            x:Name="masterContainerControl">
    <local:ContainerControl SomeProperty="{Binding ElementName=masterContainerControl, Path=SomeProperty}">
        <local:ContainerControl.Another>
            <local:AnotherControl SomeProperty="{Binding ElementName=masterContainerControl, Path=SomeProperty"/>
        </local:ExplorerBase.AddressBar>
        <local:ContainerControl.Some>
            <local:SomeControl SomeProperty="{Binding ElementName=masterContainerControl, Path=SomeProperty"/>
        </local:ContainerControl.Some>  
    </local:ContainerControl>
</UserControl>

这,当然,一切都假定MasterContainerControlContainerControlAnotherControlSomeControl都有一个名为的DependencyProperty SomeProperty ,然后绑定帮你搞定。

注意:确保在MasterContainerControl中定义了默认值,因为这些默认值将覆盖MasterContainerControl绑定到的值。

如果我误解了您的问题,请告诉我。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM