gpt4 book ai didi

c# - 将 Canvas 大小调整为相邻标签的文本高度

转载 作者:行者123 更新时间:2023-11-30 16:12:39 25 4
gpt4 key购买 nike

对于 WPF 界面,我正在构建在标签旁边显示图标的用户控件。我在 Canvas 元素中构建图标,并将其粘贴在标签旁边的 DockPanel 中。我将其捆绑到 UserControl 中,以便整个控件可以绑定(bind)到单个值并重绘图标并在更改时更新文本(想想电池表)。

我无法将图标的 Canvas 缩放到与标签文本大致相同的高度并将其大致定位在标签的基线上。有没有一种简单的方法可以做到这一点?如果我允许通过属性更改字体,我可以检查布局测量值并相应地缩放/定位图标的 Canvas 吗?

作为引用,这里是电池计量器的 XAML,以及时钟和电池计量器的图像。请注意,电池表有点接近我想要的(在基线上,但不是文本的高度),但时钟太大了。

<UserControl x:Class="Controls.Battery"
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"
xmlns:controls="clr-namespace:Controls"
x:Name="Root"
mc:Ignorable="d"
d:DesignHeight="200" d:DesignWidth="900">
<DockPanel DataContext="{Binding ElementName=Root}" LastChildFill="True" Height="200" Width="900">
<Canvas DockPanel.Dock="Left" Width="200" Height="200" Background="Transparent">
<Rectangle Width="180" Height="100" StrokeThickness="20" Canvas.Top="50" Stroke="White" RadiusX="5" RadiusY="5">
<Rectangle.Fill>
<LinearGradientBrush StartPoint="0,0" EndPoint="1,0">
<GradientStop Color="White" Offset="0"/>
<GradientStop Color="White" Offset="{Binding Percent}"/>
<GradientStop Color="Transparent" Offset="1"/>
</LinearGradientBrush>
</Rectangle.Fill>
</Rectangle>
<Rectangle Width="40" Height="50" StrokeThickness="20" Canvas.Top="75" Canvas.Right="0" Stroke="White" RadiusX="5" RadiusY="5"/>
</Canvas>

<Viewbox HorizontalAlignment="Left">
<TextBlock Text="{Binding Percent, Converter={controls:PercentConverter}}" Foreground="White" />
</Viewbox>
</DockPanel>

Canvas/Label DockPanel

最佳答案

Canvas 的子元素永远不会调整大小,它们只是定位在指定的坐标处。所以改变 Canvas 的大小不会影响它的 child 。此外,Canvas 的子元素总是被赋予它们想要的完整大小。因此,在您的情况下,我认为最好改用 Grid 元素。类似的东西:

<UserControl x:Class="Controls.Battery"
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"
xmlns:controls="clr-namespace:Controls"
x:Name="Root"
mc:Ignorable="d"
d:DesignHeight="200" d:DesignWidth="900">
<Grid DataContext="{Binding ElementName=Root}">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>

<Viewbox Grid.Column="0"
VerticalAlignment="Center"
Stretch="Uniform"
StretchDirection="Both">
<Grid Margin="10 60 10 40">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*" />
<ColumnDefinition Width="Auto" />
</Grid.ColumnDefinitions>
<Rectangle Grid.Column="0"
Width="180"
Height="100"
RadiusX="5"
RadiusY="5"
Stroke="White"
StrokeThickness="20">
<Rectangle.Fill>
<LinearGradientBrush StartPoint="0,0" EndPoint="1,0">
<GradientStop Offset="0" Color="White" />
<GradientStop Offset="{Binding Percent}" Color="White" />
<GradientStop Offset="1" Color="Transparent" />
</LinearGradientBrush>
</Rectangle.Fill>
</Rectangle>
<Rectangle Grid.Column="1"
Width="40"
Height="50"
Margin="-20 0 0 0"
RadiusX="5"
RadiusY="5"
Stroke="White"
StrokeThickness="20" />
</Grid>
</Viewbox>

<Viewbox Grid.Column="1"
HorizontalAlignment="Left"
VerticalAlignment="Center">
<TextBlock Foreground="White" Text="{Binding Percent, Converter={controls:PercentConverter}}" />
</Viewbox>
</Grid>

关于c# - 将 Canvas 大小调整为相邻标签的文本高度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22598248/

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