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

标签 c# wpf user-controls

对于 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/

相关文章:

wpf - CollectionViewSource 是如何工作的?

WPF DataGrid DataGridHyperlinkColumn 绑定(bind)到 Uri

c# - 如何使用 DependencyProperty 设置 TextBox 的绑定(bind)

c# - 限制自定义控件的可调整大小尺寸 (c# .net)

c# - 通过避免像点击事件这样的回发,使用 javascript 显示消息框。确定,取消按钮应该只关闭消息框

c# - Web 服务请求在第 3 次命中时超时

c# - C++ 和 .NET 是否在银行、医疗保健和电信等领域一起使用

将普通旧 CLR 对象序列化为 JSON 的 C# 代码

c# - WPF - 用户控件非常慢

.net - UserControl 句柄多久重新创建一次?