在WPF中使用父元素的UserControl?

28 浏览
0 Comments

在WPF中使用父元素的UserControl?

在WPF中,当你有一个用户控件时,它能否从外部访问它的父元素呢?例如,我的用户控件只是列出一些通用的东西,这些东西保存在控件中,该控件封装在主窗口上的dockpanel中,但我有一个文本框和一个按钮位于主窗口中,我希望从控件中访问它们…这可能吗?

这将节省我很多时间,而不是改变整个窗口的内容,并在每个用户控件中显示相同的文本框/按钮。如果有人有这方面的例子,将不胜感激。

admin 更改状态以发布 2023年5月24日
0
0 Comments

一个更好的设计模式是让用户控件通过事件通知主窗口需要进行更改,并通过方法询问窗口需要的信息。例如,你可以在窗口上定义一个GetText()方法,用户控件可以调用,以及一个ChangeText事件,窗口可以订阅。\n\n思路是始终让窗口保持控制。使用这种思维模式将使你更容易开发未来的应用程序。

0
0 Comments

是的,这是可能的,这里有一些我用来组合带有DP的UserControls的代码。

我不怎么喜欢它,但它可以工作。我也认为这是一个很棒的话题,也许一些代码可以帮助得到更好的答案!

干杯,
Berry

UserControl XAML


UserControl Code Behind

public partial class AddNewItemButton : UserControl
{
    ...
    #region Item Name
    public static readonly DependencyProperty ItemNameProperty = DependencyProperty.Register(
        "ItemName", typeof(string), typeof(AddNewItemButton),
        new FrameworkPropertyMetadata(OnItemNameChanged));
    public string ItemName
    {
        get { return (string)GetValue(ItemNameProperty); }
        set { SetValue(ItemNameProperty, value); }
    }
    public string ButtonText { get { return (string) tbItemName.Content; } }
    private static void OnItemNameChanged(DependencyObject obj, DependencyPropertyChangedEventArgs args)
    {
        // When the item name changes, set the text of the item name
        var control = (AddNewItemButton)obj;
        control.tbItemName.Content = string.Format(GlobalCommandStrings.Subject_Add, control.ItemName.Capitalize());
        control.ToolTip = string.Format(GlobalCommandStrings.Subject_Add_ToolTip, control.ItemName);
    }
    #endregion
    #region Command
    public static readonly DependencyProperty CommandProperty = DependencyProperty.Register(
        "Command", typeof(ICommand), typeof(AddNewItemButton),
        new FrameworkPropertyMetadata(OnCommandChanged));
    public ICommand Command
    {
        get { return (ICommand)GetValue(CommandProperty); }
        set { SetValue(CommandProperty, value); }
    }
    private static void OnCommandChanged(DependencyObject obj, DependencyPropertyChangedEventArgs args)
    {
        // When the item name changes, set the text of the item name
        var control = (AddNewItemButton)obj;
        control.btnAddNewItem.Command = control.Command;
    }
    #endregion
}

enter image description here

另一个UserControl显示组合


    
        ...
        
        ...
    

enter image description here

0