6

wpfにユーザーコントロールがある場合、その親要素の外部に到達できますか?たとえば、私のユーザーコントロールには、メインウィンドウのドックパネル内にカプセル化されたコントロール内に保持されているいくつかの一般的なものがリストされていますが、メインウィンドウにコントロールからアクセスしたいテキストボックスとボタンがあります...これは可能ですか?

ウィンドウ全体のコンテンツを変更して、すべてのユーザーコントロールに同じテキストボックス/ボタンを表示するよりも、時間を大幅に節約できます。誰かがこれの例を持っているならば、それは大いにありがたいです。

4

3 に答える 3

3

より良い設計パターンは、何かを変更する必要があるときにユーザー コントロールが (イベントを介して) メイン ウィンドウに通知し、何らかの情報が必要なときに (メソッドを介して) ウィンドウに問い合わせることです。たとえば、ユーザーコントロールが呼び出すことができるウィンドウに GetText() メソッドがあり、ウィンドウがサブスクライブするユーザーコントロールに ChangeText イベントがあります。

アイデアは、ウィンドウを常に制御し続けることです。この考え方を使用すると、将来のアプリケーションの開発が容易になります。

于 2012-04-17T23:59:14.450 に答える
3

はい、可能です。DP を持つ UserControls からプレゼンテーションを作成するために使用したコードを次に示します。

少しでも好きではありませんが、うまくいきます。また、これは素晴らしいトピックだと思います。おそらく、いくつかのコードがより良い答えを得るのに役立つでしょう!

乾杯、
ベリー

ユーザー コントロール XAML

<Button x:Name="btnAddNewItem" Style="{StaticResource blueButtonStyle}" >
    <StackPanel Orientation="Horizontal">
        <Image Source="{resx:Resx ResxName=Core.Presentation.Resources.MasterDetail, Key=bullet_add}" Stretch="Uniform" />
        <Label x:Name="tbItemName" Margin="5" Foreground="White" Padding="10, 0">_Add New [item]</Label>
    </StackPanel>
</Button>

UserControl コード ビハインド

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

}

ここに画像の説明を入力

コンポジションを示す別の UserControl

<UserControl ...
         xmlns:uc="clr-namespace:Smack.Core.Presentation.Wpf.Controls.UserControls" 
         >

    <DockPanel LastChildFill="True">
        ...
        <uc:AddNewItemButton x:Name="_addNewItemButton" Margin="0,0,10 0" DockPanel.Dock="Right"  />
        ...
    </DockPanel>
</UserControl>

ここに画像の説明を入力

于 2012-04-18T00:46:43.113 に答える
2

あなたの質問に答えるには: はい、RelativeSource バインディングを介して、またはバック コードの Parent メンバーを介して、親コントロールにアクセスできます。しかし、より良い答えは@KendallFreyの答えに似ています。Light MVVMのようなフレームワークを採用し、そのメッセンジャー クラスを使用するか、Kendall が説明した方法でイベントを使用します。

于 2012-04-18T00:44:12.537 に答える