1

私は UserControl を拡張する MyUserControl クラスをパラメータで持っています:

namespace MyNameSpace
{
    public partial class MyUserControl: UserControl
    {
        public MyUserControl()
        {
            InitializeComponent();
        }

        private Control _owner;
        public Control Owner
        {
            set { _owner = value; }
            get { return _owner; }
        }
    }
}

たとえば、XAML 内の Grid をそのパラメーターとして渡すにはどうすればよいですか?

<Window x:Class="MyNameSpace.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525"
        xmlns:my="clr-namespace:MyNameSpace">
    <Grid x:Name="grid1">
        <my:MyUserControl x:Name="myUserControl1" Parent="*grid1?*" />
    </Grid>
</Window>
4

2 に答える 2

3

OwnerプロパティをDependencyPropertyとして実装する必要があります。これは、ユーザー コントロールに必要なコードです。

public static readonly DependencyProperty OwnerProperty =
    DependencyProperty.Register("Owner", typeof(Control), typeof(MyUserControl), 
    new FrameworkPropertyMetadata(null, OnOwnerPropertyChanged)
);

private static void OnOwnerPropertyChanged(DependencyObject source, DependencyPropertyChangedEventArgs e)
{
    ((MyUserControl)source).Owner = (Control)e.NewValue;
}

public Control Owner
{
    set { SetValue(OwnerProperty, value); }
    get { return (Control)GetValue(OwnerProperty); }
}

次に、XAML で、期待どおりにプロパティを設定できます。

<Button x:Name="Button1" Content="A button" />
<my:MyUserControl Owner="{Binding ElementName=Button1}" x:Name="myUserControl1" />

( grid1はControlではなくFrameworkElement型から継承するため、例が機能しないことに注意してください。 OwnerプロパティをFrameworkElement型に変更して、 grid1に設定できるようにする必要があります。)

依存関係プロパティの詳細については、次の優れたチュートリアルを参照してください: http://www.wpftutorial.net/dependencyproperties.html

于 2012-05-17T05:48:47.073 に答える
0

Uは、より簡単に説明されているように、バインディングにDependancyPropertyを使用する必要があります。また、RelativeSourceを使用することもできます。

Parent={Binding RelativeSource={RelativeSource AncestorType=Grid}}
于 2012-05-17T05:52:03.937 に答える