WPF 导航和销毁当前 UserControl

Posted

技术标签:

【中文标题】WPF 导航和销毁当前 UserControl【英文标题】:WPF navigation and destroy current UserControl 【发布时间】:2016-08-04 11:50:03 【问题描述】:

我正在尝试在我的 WPF 应用程序中构建一个小型导航系统。我正在使用this 教程在页面之间导航。我想为一个UserControl 添加“返回”功能。

我有一个 UserControl Orders 和另一个 UserControl OrderOrders 显示在 MainWindow 中,当我单击按钮时,Order UserControl 应该显示在 MainWindow 的同一位置。我尝试在Order 用户控件中引用Orders 用户控件,并通过Order 导航到Orders。但是Order 没有被破坏,因为我使用的是该类中的变量。

我如何确保当我从Orders 导航到Order 时,Orders 没有被破坏,当我从Order 导航到Orders 时,Order 被破坏。

Orders 类中的按钮点击事件处理程序:

private void ShowOrder(object sender, RoutedEventArgs e)

    Order order = new Order();
    Switcher.Switch(order);

Order 类中的返回按钮点击处理程序

public UserControl parent;

private void ReturnBack(object sender, RoutedEventArgs e)

    Switcher.Switch(parent);

【问题讨论】:

【参考方案1】:

我通常会做下一个使用 ControlTemplate 的模式,假设你的班级有:

private Enums.View _currView;
public Enums.View CurrView 

    get
    
        return _currView;
    
    set
    
        _currView = value;
        OnPropertyChanged("CurrView");
    

当 Enums.View 为:

public enum View

    ViewA = 1,
    ViewB = 2,
    ViewC = 3,

然后,使用上面的 Binding to CurrView 我们在视图发生变化时更改视图:

<UserControl ...
         xmlns:Views="clr-namespace:CustomersManager.View"
         d:DesignHeight="300" d:DesignWidth="300">

    <UserControl.Resources>
        <!--*********** Control templates ***********-->
        <ControlTemplate x:Key="DefultTemplate">
            <Views:DefultCustomersView/>
        </ControlTemplate>
        <ControlTemplate x:Key="A">
            <Views:ViewAllCustomersView />
        </ControlTemplate>
        <ControlTemplate x:Key="B">
            <Views:AddNewCustomersView />
        </ControlTemplate>
        <ControlTemplate x:Key="C">
            <Views:EditCustomersView />
        </ControlTemplate>
    </UserControl.Resources>

    <Border BorderBrush="Gray" BorderThickness="2">
        <Grid>
            <ContentControl DataContext="Binding" >
                <ContentControl.Style>
                    <Style TargetType="ContentControl">
                        <Setter Property="Template" Value="StaticResource DefultTemplate" />
                        <Style.Triggers>
                            <DataTrigger Binding="Binding Path=CurrView" Value="ViewA">
                                <Setter Property="Template" Value="StaticResource A" />
                            </DataTrigger>
                            <DataTrigger Binding="Binding Path=CurrView" Value="ViewB">
                                <Setter Property="Template" Value="StaticResource B" />
                            </DataTrigger>
                            <DataTrigger Binding="Binding Path=CurrView" Value="ViewC">
                                <Setter Property="Template" Value="StaticResource C" />
                            </DataTrigger>
                        </Style.Triggers>
                    </Style>
                </ContentControl.Style>
            </ContentControl >
        </Grid>  
    </Border> 
</UserControl>

【讨论】:

以上是关于WPF 导航和销毁当前 UserControl的主要内容,如果未能解决你的问题,请参考以下文章

页面(视图)之间的 C# WPF 导航

在 WPF MVVM 中的视图之间导航

实例化新 VC 后销毁当前 tabbarVC

从用户控件中导航WPF选项卡控件?

Backbone.js:在视图之间导航 - 销毁和重新创建

WPF 中页面和窗口之间的导航