8,737
社区成员
发帖
与我相关
我的任务
分享
/// <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");
}
}