如何在WPF中将内部控件的属性公开给其父UserControl

np8igboo  于 2022-11-18  发布在  其他
关注(0)|答案(2)|浏览(166)

我有一个DialogPrompt UserControl,它将有一个Image和一个TextBlock。模板如下:

<UserControl>   
      <Button x:Name="_OkButton" Content="OK"/>
      <DockPanel >
        <Image/>
        <TextBlock x:Name="_DialogTextBox" />
      </DockPanel>
    </UserControl>

如何公开UserControl内TextBlock的Image和Text属性的Source属性?

w6mmgewl

w6mmgewl1#

我将创建两个DependencyProperties,一个用于Text,另一个用于ImageSource
ImageSourceDependencyProperty会在内部Image控件更新时自动设定它的来源。类似地,TextDependencyProperty也会设定内部TextBlock控件的Text
设置如下:

public partial class MyUserControl : UserControl
    {
        #region ImageSource
        public static readonly DependencyProperty ImageSourceProperty = 
            DependencyProperty.Register
            ( 
                "ImageSource", 
                typeof(Uri),
                typeof(MyUserControl), 
                new FrameworkPropertyMetadata(new PropertyChangedCallback(OnImageSourceChanged))
            );
     
        public Uri ImageSource
        {
            get { return (Uri)GetValue(ImageSourceProperty); }
            set { SetValue(ImageSourceProperty, value); }
        }
        #endregion ImageSource
    
        #region Text
        public static readonly DependencyProperty TextProperty = 
            DependencyProperty.Register
            ( 
                "Text", 
                typeof(string),
                typeof(MyUserControl), 
                new FrameworkPropertyMetadata("")
            );
     
        public string Text
        {
            get { return (string)GetValue(TextProperty); }
            set { SetValue(TextProperty, value); }
        }
        #endregion Text
    
        public MyUserControl()
        {
            InitializeComponent();
        }
    
        private static void OnImageSourceChanged(DependencyObject sender, DependencyPropertyChangedEventArgs e)
        {
            var myUserControl = sender as MyUserControl;
            if (myUserControl != null)
            {
                myUserControl.ImageSource.Source = new BitmapImage((Uri) e.NewValue);
            }
        }
    }

每当ImageSource改变时,这将自动更新内部Image控件的源代码。注意,由于Image控件本身使用ImageSource类型,我们需要在这里做一些转换。
然后,可以将XAML更新为:

<UserControl x:Name="ControlName">   
          <Button x:Name = "OkButton" Content="OK"/>
          <DockPanel >
            <Image x:Name = "MyImage" />
            <TextBlock x:Name = "DialogTextBox" Text="{Binding ElementName=ControlName, Path=Text}"/>
          </DockPanel>
        </UserControl>

这里,内部TextBlock控件只是绑定到父级(主UserControl)的TextDependencyProperty

vulvrdjw

vulvrdjw2#

在您的代码后面,添加2个DependencyProperties,并将它们绑定到Image Source和TextBlock Text。
以下是有关如何使用和创建依赖关系属性的教程:http://www.wpftutorial.net/dependencyproperties.html
对于xaml中的绑定,下面是一个示例:

<Image Source="{Binding YourProperty, RelativeSource={RelativeSource FindAncestor, AncestorType=YourUserControl}}/>

相关问题