WPF 从窗口中的框架导航到用户控件,并将参数传递给它

本文关键字:控件 参数传递 用户 窗口 导航 框架 WPF | 更新日期: 2023-09-27 18:34:13

我在 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>

我的应用程序中有菜单项,当我单击供应商项时,我用用户控件填充框架,如下所示:

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>

当我点击"付款"按钮时,我导航到另一个用户控件(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>

这是我的问题来了:我需要将参数从供应商用户控件传递到MakePayment UserControl。如何以编程方式在供应商中传递参数并在MakePayment中读取它们?

谢谢。

WPF 从窗口中的框架导航到用户控件,并将参数传递给它

如果你能把一个绑定到另一个,那就是你应该做的。到目前为止,使两个用户控件"通信"(或共享两个都可以执行操作的属性)的最简单方法是在每个控件上定义一个 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都有一个名为SomeProperty的依赖属性,然后绑定密封交易。

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

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