编程语言
首页 > 编程语言> > c#-将画布的大小调整到相邻标签的文本高度

c#-将画布的大小调整到相邻标签的文本高度

作者:互联网

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

我在将图标的画布缩放到与标签文本大致相同的高度并将其大致定位在标签基线上时遇到麻烦.是否有捷径可寻?如果我允许通过属性更改字体,该如何检查布局尺寸并相应地缩放/定位图标的画布呢?

作为参考,以下是电池电量表的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>

解决方法:

您不应在xaml中使用确切的像素值,而应绑定这些值并使用转换器设置适当的值. (至少这是我会做的…)

因此,将您的TextBlock命名为:

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

之后,您可以绑定到该属性的ActualWidth和ActualHeight属性.

例如:

<Canvas DockPanel.Dock="Left" 
        Width="200" 
        Height="{Binding Path=ActualHeight, ElementName=textPart}" 
        Background="Transparent">
...

为了进一步改善外观,您应该引入转换器,这将允许您将宽度设置为给定高度的百分比,或者您想要的任何形式.

另外,您可以在画布上引入ScaleTransform,这很可能会减少对转换器的需求,因为您可以以一种尺寸设计“图片”,并且只需修改ScaleTansform使其尺寸正确即可.

标签:user-controls,wpf,c
来源: https://codeday.me/bug/20191121/2055730.html