为什么单行和多行按钮都被禁用时它们看起来不同?

时间:2019-04-11 14:25:32

标签: wpf xaml user-interface

这是包含两个按钮的窗口的XAML,两个按钮均被禁用。通过将按钮的内容设置为包含两个TextBlock的StackPanel,可以使其中之一成为多行。

<Window x:Class="MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800">
    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="*" />
            <ColumnDefinition Width="*" />
        </Grid.ColumnDefinitions>
        <Button Grid.Column="0" Content="Single line" IsEnabled="False" />
        <Button Grid.Column="1" IsEnabled="False">
            <StackPanel>
                <TextBlock HorizontalAlignment="Center">Double</TextBlock>
                <TextBlock HorizontalAlignment="Center">Line</TextBlock>
            </StackPanel>
        </Button>
    </Grid>
</Window>

这是运行程序时机器上的样子:

enter image description here

为什么一个按钮上的文本与另一个按钮不同?在单行按钮上,文本是更加褪色的颜色。我希望两个按钮上的文字看起来都一样。

另外:

  • 我只想在XAML中这样做。

  • 文本必须如图所示位于按钮的中心(由框架自动完成,而无需我通过插入不间断空格等来手动将其隔开)。特别是,导致“直线”中“ L”的左边缘与“双重”中“ D”的左边缘垂直对齐的解决方案是不可接受的。 (因此,在第二个按钮中使用Content属性,但在文本中嵌入&#xa;并不是可行的解决方案,因为它会导致这种效果。)

  • 我不想将大量样式信息粘贴到我的XAML中。涉及粘贴禁用按钮外观定义的解决方案是不可接受的;我希望两个按钮都看起来像操作系统上默认情况下禁用的按钮应该看起来一样,而不必明确指定其含义。声明性解决方案涉及指示XAML使用通常在禁用按钮中应用于文本的任何样式-很好,只要我不必显式指定该样式是什么样。

3 个答案:

答案 0 :(得分:1)

我安装了最新版本的.NET Framework Developer Pack,然后重新启动了计算机。当机器重新启动时,无论是在我的示例项目中还是在我第一次看到该问题的真实项目中,我都无法重现该问题。我不知道是否通过更新.NET Framework Developer Pack或通过重新启动解决了该问题。

由于我不知道最终导致问题的原因或我采取的措施是解决该问题的方法,因此我不会将其标记为可接受的答案,但我会提供它以防对其他人有帮助。也许有人能够对我最初看到的行为做出解释。

答案 1 :(得分:0)

这是一个回复,所以我可以为您添加图片。

我刚刚复制了XAML,它对我来说看起来完全一样,效果很好。 您需要检查是否在任何可能导致此行为的地方定义了任何样式(运行时看起来相同)

enter image description here

更新:

<Button Grid.Column="1" IsEnabled="False">
    <TextBlock HorizontalAlignment="Center">
        <Run>Double</Run>
        <LineBreak/>
        <Run>Line</Run>
    </TextBlock>
</Button>

答案 2 :(得分:0)

在Win10上使用vs2017,您所拥有的(也)将给我带来预期的结果。

您也可以使用一个文本块获得相同的效果:

    <Button Grid.Column="0" Content="Single line" IsEnabled="False" />
    <Button Grid.Column="1" IsEnabled="False">
        <TextBlock Style="{x:Null}" TextAlignment="Center">Double<LineBreak/>Line</TextBlock>
    </Button>

该标记还将文本块上的所有样式设置为null。 听起来似乎无济于事,但我不理解您的解决方案中发生的事情。