gpt4 book ai didi

c# - 获取控件的形状作为 Geometry

转载 作者:太空宇宙 更新时间:2023-11-03 11:30:43 26 4
gpt4 key购买 nike

有没有办法获取控件的形状并将其转换为 Geometry对象?

我遇到以下情况:在 WPF 应用程序中将显示一个弹出窗口。这个弹出窗口不是窗口,它是一个控件,它将变得可见。应用程序的其余部分将变暗,因为应用程序上方有一个灰色层。

现在的问题是这个灰色层也在弹出窗口本身之上,这是由应用程序的设计加上被单击并打开弹出窗口的元素也不应该被层隐藏。我决定将剪裁几何体附加到灰色层,这很好,但我必须检测所有我不想自己隐藏的形式和路径。

所以回到我的问题:有没有办法获得控件的形状并将其转换为 Geometry目的?例如。我找到了获取控件的 VisualBrush 的方法,但也无法转换它 - 或者只是看不出它是如何可能的。

最佳答案

你可以这样做:从可视化树中移除按钮并将其放置在装饰器上。当装饰器关闭时,再次将其附加到原始父级。我认为这比剪裁任何几何图形要灵活得多,并使其更加灵活(例如,您可以在装饰器上放置复杂的内容,如用户控件)

以下示例使用 Panel 作为按钮的容器。

Xaml(窗口):

<Grid Margin="50" x:Name="myGrid" Background="LightBlue">
<Button x:Name="myButton" Width="80" Height="30" Click="myButton_Click">Show popup</Button>

代码隐藏: 私有(private) FrameworkElementAdorner _adorner; 私有(private)面板_originalParent;

private void myButton_Click(object sender, RoutedEventArgs e)
{
if (_adorner == null)
{
_adorner = new FrameworkElementAdorner(myGrid);
}

// remove the button from the parent panel and attach it to the adorner
// otherwise remove from adorner and attach to original parent again
if (_adorner.IsVisible)
{
AdornerLayer adornerLayer = AdornerLayer.GetAdornerLayer(myGrid);
adornerLayer.Remove(_adorner);

Panel parent = VisualTreeHelper.GetParent(myButton) as Panel;
if (parent != null)
{
parent.Children.Remove(myButton);
}
_originalParent.Children.Add(myButton);
}
else
{
_originalParent = VisualTreeHelper.GetParent(myButton) as Panel;
if (_originalParent != null)
{
_originalParent.Children.Remove(myButton);
}

// Create the Adorner with the original button in it
_adorner.Child = CreateAdornerContent(myButton);

AdornerLayer adornerLayer = AdornerLayer.GetAdornerLayer(myGrid);
adornerLayer.Add(_adorner);
}
}

/// <summary>
/// Creates some dummy content for the adorner
/// </summary>
private FrameworkElement CreateAdornerContent(Button myButton)
{
Grid g = new Grid();
g.Background = new SolidColorBrush(Colors.Yellow);

TextBlock tb = new TextBlock();
tb.Text = "I am the Adorner";

g.Children.Add(tb);
g.Children.Add(myButton);
return g;
}

这里是仅显示框架元素的简单装饰器:FrameworkElementAdorner 类:装饰器 { 私有(private) FrameworkElement _child;

public FrameworkElementAdorner(UIElement adornedElement)
: base(adornedElement)
{
}

protected override int VisualChildrenCount
{
get
{
return 1;
}
}

protected override Visual GetVisualChild(int index)
{
if (index != 0) throw new ArgumentOutOfRangeException();
return _child;
}

public FrameworkElement Child
{
get
{
return _child;
}
set
{
if (_child != null)
{
RemoveVisualChild(_child);
}
_child = value;
if (_child != null)
{
AddVisualChild(_child);
}
}
}

protected override Size ArrangeOverride(Size finalSize)
{
_child.Arrange(new Rect(new Point(0, 0), finalSize));
return new Size(_child.ActualWidth, _child.ActualHeight);
}

如果你愿意,我也可以上传完整的 sln。这在这里有可能吗?

关于c# - 获取控件的形状作为 Geometry,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7886472/

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