gpt4 book ai didi

WPF Canvas 和网格叠加

转载 作者:行者123 更新时间:2023-12-05 00:42:55 25 4
gpt4 key购买 nike

我有一个 Grid它代表一些数据,我需要一个 Canvas覆盖在它上面以布置一些线。 Canvas里面是它自己的UserControl .

问题在于CanvasGrid 时,其内容应自动调整大小调整宽度和高度。

我添加了 Canvas里面ViewBox ,但它没有成功。当Grid调整大小,Canvas没有。 Canvas的目的是在网格顶部覆盖类似标尺的功能。

期待您的解决方案。

编辑

我不能使用网格上的样式来替换 Canvas ,因为网格显示的信息与 Canvas 不同。把它想象成图表,其中有不同大小的条形柱(在我的例子中是网格),而天数是叠加的线条(就像甘特图一样)

我的代码:

    taxCanvas = new TimeAxis();
Grid.SetRowSpan(taxCanvas, GRightMain.RowDefinitions.Count);
Grid.SetColumnSpan(taxCanvas, GRightMain.ColumnDefinitions.Count);

Grid.SetColumn(taxCanvas, 0);
Grid.SetRow(taxCanvas, 0);


Grid.SetZIndex(taxCanvas, -1);

taxCanvas.Height = GRight.ActualHeight;
taxCanvas.Width = GRight.ActualWidth;

GRightMain.Children.Add(taxCanvas);

TimeAxis 是我的 Canvas 用户控件,GRightMain 是一个网格,它在同一行和列中包含我的 Canvas 和带有内容 (Gright) 的网格。

希望这可以帮助

最佳答案

在我看来, Canvas 绝对是错误的方法。

我强烈建议您查找 Adorners。您可以创建一个自定义装饰器来做到这一点。

Adorner 基本上是一个位于所有 UIElement 之上的“非交互式窗口”。它允许你做任何你想做的事情(创建控件、绘制东西等等),这些内容会出现在控件本身的顶部。

想象一张木制咖啡 table ,上面放着一块透明玻璃。如果你在透明玻璃上画画,你仍然可以看到咖啡 table 。唯一的区别是您实际上可以直接穿过咖啡 table 上的透明玻璃并触摸木材本身。

我讨厌张贴 MSDN 链接...但是...呃。在这种情况下,这将是一个好的开始:

http://msdn.microsoft.com/en-us/library/ms743737.aspx

编辑:

我迅速地把东西扔在一起。希望这有帮助吗?

<Window x:Class="WpfApplication1.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:loc="clr-namespace:WpfApplication1"
Title="MainWindow" Height="350" Width="525">
<Grid>
<loc:GridWithRulerxaml></loc:GridWithRulerxaml>
<Button Height="20" Width="50" >Click me</Button>
<TextBox Width="150" Height="25" HorizontalAlignment="Left">This is a text box</TextBox>
</Grid>
</Window>

用户控制:
<UserControl x:Class="WpfApplication1.GridWithRulerxaml"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
mc:Ignorable="d"
d:DesignHeight="300" d:DesignWidth="300">
<Grid>

</Grid>
</UserControl>

用户控制代码隐藏:
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;

namespace WpfApplication1
{
/// <summary>
/// Interaction logic for GridWithRulerxaml.xaml
/// </summary>
public partial class GridWithRulerxaml : UserControl
{
public GridWithRulerxaml()
{
InitializeComponent();

//Loaded event is necessary as Adorner is null until control is shown.
Loaded += GridWithRulerxaml_Loaded;

}

void GridWithRulerxaml_Loaded(object sender, RoutedEventArgs e)
{
var adornerLayer = AdornerLayer.GetAdornerLayer(this);
var rulerAdorner = new RulerAdorner(this);
adornerLayer.Add(rulerAdorner);
}
}
}

最后是装饰者本身:
using System.Windows;
using System.Windows.Documents;
using System.Windows.Media;

namespace WpfApplication1
{
public class RulerAdorner : Adorner
{
private FrameworkElement element;
public RulerAdorner(UIElement el) : base(el)
{
element = el as FrameworkElement;
}

protected override void OnRender(System.Windows.Media.DrawingContext drawingContext)
{
base.OnRender(drawingContext);

double height = element.ActualHeight;
double width = element.ActualWidth;

double linesHorizontal = height/50;
double linesVertical = width/50;

var pen = new Pen(Brushes.RoyalBlue, 2) { StartLineCap = PenLineCap.Triangle, EndLineCap = PenLineCap.Triangle };

int offset = 0;

for (int i = 0; i <= linesVertical; ++i)
{
offset = offset + 50;
drawingContext.DrawLine(pen, new Point(offset, 0), new Point(offset, height));
}

offset = 0;

for (int i = 0; i <= linesHorizontal; ++i)
{
offset = offset + 50;
drawingContext.DrawLine(pen, new Point(0, offset), new Point(width, offset));
}
}
}
}

如果您希望我详细说明代码本身,请告诉我。

我确认这将在您主页上的任何内容上方绘制一个网格。您应该仍然能够与下面的内容进行交互。

关于WPF Canvas 和网格叠加,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1660301/

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