【问题标题】:Why do my single-line and multi-line buttons look different when they are both disabled?为什么我的单行和多行按钮都被禁用时看起来不同?
【发布时间】:2019-04-11 14:25:31
【问题描述】:

这是一个包含两个按钮的窗口的 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>

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

为什么一个按钮上的文本与另一个不同?在单行按钮上,文本颜色较淡。我希望两个按钮上的文本看起来相同。

另外:

  • 我想纯粹在 XAML 中执行此操作。

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

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

【问题讨论】:

    标签: wpf xaml user-interface


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

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

      更新:

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

      【讨论】:

      • 包含我在问题中显示的代码的项目是使用 Visual Studio 中的默认 WPF 应用程序模板创建的。如果在全球范围内应用了任何非标准样式(我不相信有),那么它们是 VS 模板的一部分。如果您认为是这种情况,请让我知道我可能会在哪里查看。
      • 重启你的 IDE 对我来说听起来像是一个独角兽问题。请让我知道重启是否解决了问题,否则我的大脑不会让我休息
      • 好的,我刚刚关闭了所有打开的 Visual Studio 实例并重新打开了测试项目,正如我所料,它的行为与以前完全相同。我认为很明显,您不知道是什么导致了这种行为或如何解决它。但是,根据您无法重现该行为,我推断它可能特定于某个版本的开发工具、运行时或操作系统。
      • 能否新建一个空项目,看看问题是否依然存在?如果是这种情况,那肯定是代码无关的问题
      • 我做到了。这就是我创建用作该屏幕截图基础的项目的方式。在我的实际项目中,我没有使用只填充两个禁用按钮的主窗口。
      【解决方案3】:

      你所拥有的(也)给了我在 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。 听起来无济于事,但我不了解您的解决方案中发生了什么。

      【讨论】:

        猜你喜欢
        • 2018-07-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-07-16
        • 1970-01-01
        • 1970-01-01
        • 2017-09-02
        • 1970-01-01
        相关资源
        最近更新 更多