gpt4 book ai didi

c# - 容器如何知道 child 何时调用了 InvalidateArrange?

转载 作者:太空狗 更新时间:2023-10-29 21:51:08 24 4
gpt4 key购买 nike

我正在尝试学习在 WinRT XAML 应用程序中创建自定义面板的基础知识。我已经定义了一个附加的依赖属性,它按预期工作,除了我无法弄清楚如何获取子元素的属性回调以触发容器的排列或测量。

让 child 让它的容器知道应该再次调用 arrange 和 measure 的正确方法是什么?在我发布的 WPF 4 书中,他们使用了 FrameworkPropertyMetadataOptions.AffectsParentArrange,但这在 WinRT 中似乎不可用。

public class SimpleCanvas : Panel
{
#region Variables
#region Left Property
public static double GetLeft(UIElement element)
{
if (element == null)
{
throw new ArgumentNullException("element");
}

object value = element.GetValue(LeftProperty);
Type valueType = value.GetType();
return Convert.ToDouble(value);
}

public static void SetLeft(UIElement element, double value)
{
if (element == null)
{
throw new ArgumentNullException("element");
}

element.SetValue(LeftProperty, value);
}

public static readonly DependencyProperty LeftProperty =
DependencyProperty.RegisterAttached("Left", typeof(double), typeof(SimpleCanvas),
new PropertyMetadata(0, OnLeftPropertyChanged));

public static void OnLeftPropertyChanged(DependencyObject source, DependencyPropertyChangedEventArgs e)
{
UIElement element = (UIElement)source;
// This doesn't cause ArrangeOverride below to be called
element.InvalidateArrange();
}
#endregion

#region Top Property
public static double GetTop(UIElement element)
{
if (element == null)
{
throw new ArgumentNullException("element");
}

object value = element.GetValue(TopProperty);
return (value == null) ? 0 : (double)value;
}

public static void SetTop(UIElement element, double value)
{
if (element == null)
{
throw new ArgumentNullException("element");
}

element.SetValue(TopProperty, value);
}

public static readonly DependencyProperty TopProperty =
DependencyProperty.RegisterAttached("Top", typeof(double), typeof(SimpleCanvas),
new PropertyMetadata(0, OnTopPropertyChanged));

public static void OnTopPropertyChanged(DependencyObject source, DependencyPropertyChangedEventArgs e)
{
UIElement element = (UIElement)source;
// This doesn't cause ArrangeOverride below to be called
element.InvalidateArrange();
}
#endregion
#endregion

public SimpleCanvas()
{

}

#region Methods
protected override Size MeasureOverride(Size availableSize)
{
foreach (UIElement child in this.Children)
{
child.Measure(new Size(double.PositiveInfinity, double.PositiveInfinity));
}

return new Size(0, 0);
}

protected override Size ArrangeOverride(Size finalSize)
{
foreach (UIElement child in this.Children)
{
double x = 0;
double y = 0;

double left = GetLeft(child);
double top = GetTop(child);

if (!double.IsNaN(left))
{
x = left;
}
if (!double.IsNaN(top))
{
y = top;
}

child.Arrange(new Rect(new Point(x, y), child.DesiredSize));
}

return finalSize;
}
#endregion
}

最佳答案

我参加聚会迟到了,但我朝着相同的方向前进并面临相同的问题。这是我的解决方案。

在您的回调中,您对附加属性的子元素调用 InvalidateArrange:

public static void OnTopPropertyChanged(DependencyObject source, DependencyPropertyChangedEventArgs e)
{
UIElement element = (UIElement)source;
// This doesn't cause ArrangeOverride below to be called
element.InvalidateArrange();
}

但是你真的应该通过改变你的代码来使面板无效:

public static void OnTopPropertyChanged(DependencyObject source, DependencyPropertyChangedEventArgs e)
{
UIElement panel= VisualTreeHelper.GetParent(source) as UIElement;
if(panel != null)
panel.InvalidateArrange();
}

它应该有效(对我有用)。

关于c# - 容器如何知道 child 何时调用了 InvalidateArrange?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12982032/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com