WPF自定义控件的自定义属性如何在调用XAML中设置?

conwinston 2012-03-12 03:52:58
我的自定义控件(MyControl)中定义了一个属性:
private Button _myButton = null;
public StackPanel MyButton
{
get { return _myButton; }
set
{
_myButton = value;
OnPropertyChanged(new PropertyChangedEventArgs("MyButton"));
}
}

让它在调用界面的XAML中关联一个Button:
<Button Name="Button1"/>
<MyControl MyButton="Button1"/>

这样写运行后报错,错误提示不能将String转化成Button。
这种自定义控件中定义关联其他控件的方式在WinForm里非常常用,求教在WPF中英如何实现。
...全文
811 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
sundayX 2012-03-16
  • 打赏
  • 举报
回复
使用DependencyProperty
一个破人 2012-03-15
  • 打赏
  • 举报
回复
贴了那么多代码,没用啊。

自定义控件也是对象啊!

实例化对象,调用属性即可。

hiworldman 2012-03-12
  • 打赏
  • 举报
回复
首先代码有问题,另可以这样实现。在考虑如何实现类似与Binding Element那样的效果


/// <summary>
/// 在考虑如何做成Binding ElementName Path类似的效果
/// </summary>
public class PropertyRegister : Button
{
public PropertyRegister()
{

}


public static readonly DependencyProperty ContorlNameProperty =
DependencyProperty.Register("ContorlName", typeof(string), typeof(PropertyRegister), new PropertyMetadata(null, ContorlNamePropertyChangedCallback));

private static void ContorlNamePropertyChangedCallback(DependencyObject sender, DependencyPropertyChangedEventArgs e)
{
//无法在设计中时获取 控件的树形结构
//此控件加载完了之后才能弄VisualTreeHelper获取相应的父子控件
//PropertyRegister owner = sender as PropertyRegister;
//owner.MyButton = GetNearObject<Button>(owner, e.NewValue.ToString());
}

public T GetRefControl<T>() where T : FrameworkElement
{
return GetNearObject<T>(this, ContorlName);
}

public string ContorlName
{
get
{
return (string)GetValue(ContorlNameProperty);
}
set
{
SetValue(ContorlNameProperty, value);
}
}

public static T GetParentObject<T>(DependencyObject obj, string name) where T : FrameworkElement
{
DependencyObject parent = VisualTreeHelper.GetParent(obj);

while (parent != null)
{
if (parent is T && (((T)parent).Name == name | string.IsNullOrEmpty(name)))
{
return (T)parent;
}

parent = VisualTreeHelper.GetParent(parent);
}

return null;
}

public static T GetChildObject<T>(DependencyObject obj, string name) where T : FrameworkElement
{
DependencyObject child = null;
T grandChild = null;

for (int i = 0; i <= VisualTreeHelper.GetChildrenCount(obj) - 1; i++)
{
child = VisualTreeHelper.GetChild(obj, i);

if (child is T && (((T)child).Name == name | string.IsNullOrEmpty(name)))
{
return (T)child;
}
else
{
grandChild = GetChildObject<T>(child, name);
if (grandChild != null)
return grandChild;
}
}

return null;

}


public static T GetNearObject<T>(DependencyObject obj, string name) where T : FrameworkElement
{
DependencyObject parent = GetParentObject<FrameworkElement>(obj, "");
T nearobj = GetChildObject<T>(parent, name);
if (nearobj == null)
{
return GetNearObject<T>(parent, name);
}
return nearobj;

}




}






<Grid x:Name="LayoutRoot" Background="White">
<Grid>
<StackPanel>

<Button x:Name="btn" Click="btn_Click" Height="24"></Button>

<Slider x:Name="sd" Minimum="0" Maximum="100" Value="30"></Slider>
<TextBox Text="{Binding ElementName=sd,Path=Value}"></TextBox>
</StackPanel>
</Grid>
<na:PropertyRegister x:Name="pr" ContorlName="btn" Width="125" Height="24" Content="myCustomControl"></na:PropertyRegister>
</Grid>



public partial class TestRoot : UserControl
{
public TestRoot()
{
InitializeComponent();
}

private void btn_Click(object sender, RoutedEventArgs e)
{
pr.GetRefControl<Button>().Content = System.DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
}


}
assky124 2012-03-12
  • 打赏
  • 举报
回复
你定义的是Button 但是对外公布的属性却是StackPanel,能编译通过?

8,737

社区成员

发帖
与我相关
我的任务
社区描述
WPF/Silverlight相关讨论
社区管理员
  • WPF/Silverlight社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧