XAML 如果禁用了MenuItem,则MenuItem内的TextBlock不会变为灰色

9ceoxa92  于 2022-12-07  发布在  其他
关注(0)|答案(2)|浏览(143)

如果我使用此代码:

<MenuItem x:Name="MenuSave" Header="Save" IsEnabled="False"/>

MenuSave被禁用时(在真实的代码中由RoutedUICommand编程),Header被禁用并且文本是灰色的。
但如果我需要更多文本,如这里所示:

<MenuItem x:Name="MenuSaveAs" IsEnabled="False">
     <MenuItem.Header >
            <StackPanel Orientation="Horizontal">
                   <TextBlock Text="Save as"/>
                   <TextBlock> ...</TextBlock>
            </StackPanel>
     </MenuItem.Header>
</MenuItem>

在这种情况下,Header被禁用,但文本不是灰色的。
如何使用复合文本获得灰色文本?
这只是解释问题的简化代码,真实的的代码是翻译后的术语组合。

pu82cl6c

pu82cl6c1#

如果您通过HeaderTemplate添加TextBlock,则禁用状态将应用颜色。顺便说一下,您可以使用多个Run,这样会填充同一个TextBlock。如果您将数据项绑定为Header,则可以将其在模板中的属性绑定到Run

<MenuItem x:Name="MenuSaveAs" IsEnabled="False">
   <MenuItem.HeaderTemplate>
      <DataTemplate>
         <TextBlock>
            <Run Text="Save as"/>
            <Run> ...</Run>
         </TextBlock>
      </DataTemplate>
   </MenuItem.HeaderTemplate>
</MenuItem>

或者,如果您需要格式化具有系结属性的字串,请使用HeaderStringFormat

<MenuItem x:Name="MenuSaveAs"
          IsEnabled="False"
          Header="{Binding NameOfTheSavedItem}"
          HeaderStringFormat="Save as {0}...">

如果您坚持直接设定信头,解决方法是将TextBlockForeground明确系结至MenuItem控件样板中ContentPresenterTextElement.Foreground。您可以在每个TextBlock上系结它,或加入自动套用至范围内所有TextBlock的隐含样式。请注意 all 这个字。

<Menu>
   <Menu.Resources>
      <Style TargetType="TextBlock" BasedOn="{StaticResource {x:Type TextBlock}}">
         <Setter Property="Foreground" Value="{Binding (TextElement.Foreground), RelativeSource={RelativeSource AncestorType=ContentPresenter}}"/>
      </Style>
   </Menu.Resources>
   <MenuItem x:Name="MenuSaveAs"
             IsEnabled="True">
      <MenuItem.Header>
         <StackPanel Orientation="Horizontal">
            <TextBlock Padding="0" Text="Save as"/>
            <TextBlock Padding="0" Text="..."/>
         </StackPanel>
      </MenuItem.Header>
   </MenuItem>
</Menu>

请注意,我建议在一般的句子或段落中使用单个TextBlockRun,因为使用多个TextBlock的面板会导致不正确的间距和对齐方式,与TextBlock和其他文档相关类型提供的排版不匹配。它通常看起来奇怪、脱节,并且没有考虑字体的特性。

chhqkbe1

chhqkbe12#

我发现了另一种简单的方法,使用〈Label Padding=“0”..〉,而不是af〈TextBlock ..〉:

<MenuItem x:Name="MenuSaveAs" IsEnabled="False">
<MenuItem.Header >
    <StackPanel Orientation="Horizontal">
        <Label Padding="0" Content="Save as"/>
        <Label Padding="0" Content="..."/>
    </StackPanel>
</MenuItem.Header>

相关问题