WPF Style Textblock.textWraping не работает - PullRequest
0 голосов
/ 06 августа 2020

Полный новичок в WPF здесь. Я хочу создать несколько простых ящиков в виде сетки в WPF. И для этого я реализовал сетку 3 * 3 и теперь пытаюсь установить некоторые стили как Window.Resources и Style s. Я создал Style для Border. Все, что я установил в этом Style для Border (например, Background, CornerRadius, TextBlock.Foreground, TextBlock.FontSize), работает должным образом. Но одна вещь не работает должным образом (согласно моему пониманию. Свойство TextBlock.TextWrapping не работает. Если я устанавливаю эту опцию непосредственно на каждом Border, то она работает, но это не то, чему я хочу здесь научиться.

Почему TextBlock.TextWrapping не работает при определении Style и что мне делать? Любая помощь будет очень признательна.

<Window x:Class="Test_WPF.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"
    xmlns:local="clr-namespace:Test_WPF"
    mc:Ignorable="d"
    Title="Jocko" Height="800" Width="800">
<Window.Resources>
    <Style x:Key="GridCell" TargetType="Border">
        <Setter Property="BorderBrush" Value="Silver"/>
        <Setter Property="BorderThickness" Value="5"/>
        <Setter Property="CornerRadius" Value="30"/>
        <Setter Property="Margin" Value="1"/>
        <Setter Property="Background" Value="MidnightBlue"/>
        <Setter Property="TextBlock.Foreground" Value="White"/>
        <Setter Property="TextBlock.FontSize" Value="40"/>
        <Setter Property="TextBlock.TextAlignment" Value="Center"/>
        <Setter Property="TextBlock.TextWrapping" Value="Wrap"/>
    </Style>
</Window.Resources>
<Grid Background="AliceBlue">
     <Grid.ColumnDefinitions>
        <ColumnDefinition Width="1*" />
        <ColumnDefinition Width="1*"/>
            <ColumnDefinition Width="1*"/>
        </Grid.ColumnDefinitions>
        <Grid.RowDefinitions>
            <RowDefinition Height="1*"/>
            <RowDefinition Height="1*"/>
            <RowDefinition Height="1*"/>
        </Grid.RowDefinitions>
    
    <Border Grid.Row="0"
            Grid.Column="0"
            Style="{StaticResource GridCell}">
        <TextBlock Text="This text should be wraped but it is not"/>
    </Border>
    <Border Grid.Row="1"
            Grid.Column="0"
            Style="{StaticResource GridCell}">
        <TextBlock Text="This text should be wraped but it is not"/>
    </Border>
    <Border Grid.Row="0"
            Grid.Column="1"
            Style="{StaticResource GridCell}">
        <TextBlock Text="This text should be wraped but it is not"/>
    </Border>
    <Border Grid.Row="0"
            Grid.Column="2"
            Style="{StaticResource GridCell}">
    </Border>
    <Border Grid.Row="1"
            Grid.Column="1"
            Style="{StaticResource GridCell}">
    </Border>
    <Border Grid.Row="1"
            Grid.Column="2"
            Style="{StaticResource GridCell}">
    </Border>
    <Border Grid.Row="2"
            Grid.Column="0"
            Style="{StaticResource GridCell}">
    </Border>
    <Border Grid.Row="2"
            Grid.Column="1"
            Style="{StaticResource GridCell}">
    </Border>
    <Border Grid.Row="2"
            Grid.Column="2"
            Style="{StaticResource GridCell}">
    </Border>
</Grid>

1 Ответ

0 голосов
/ 06 августа 2020

Свойство TextWrapping - это свойство зависимости, определенное для TextBlock. Вы не можете установить его на другой тип. Когда вы попытаетесь применить его к Border, вы, скорее всего, получите такую ​​ошибку.

Локальное свойство TextWrapping может применяться только к типам, производным от TextBlock

Однако, согласно документации , есть вероятность, что это работает, но это неопределенное поведение, и вам не следует использовать это поведение или полагаться на него.

[...] Хотя может показаться, что наследование значений свойств работает для непривязанных свойств зависимостей, поведение наследования для неприсоединенного свойства через определенные границы элементов в дереве времени выполнения не определено. [...]

Он работает для других свойств TextBlock в вашем стиле, потому что они определены как прикрепленные свойства , которые могут быть применяется к любому элементу, но TextWrapping не применяется.

[...] Регистрация присоединенного свойства фактически делает присоединенное свойство глобальным свойством в системе свойств и гарантирует наследование значения свойства работает через все границы в дереве элементов. [...]

Создайте стиль только для TextBlock, где вы определяете TextWrapping и применяете его к TextBlock s.

<Style x:Key="GridCellTextBlockStyle"
       TargetType="{x:Type TextBlock}"
       BasedOn="{StaticResource {x:Type TextBlock}}">
   <Setter Property="TextWrapping" Value="Wrap"/>
</Style>
<Border Grid.Row="0"
        Grid.Column="0"
        Style="{StaticResource GridCell}">
   <TextBlock Text="This text is wrapped" Style="{StaticResource GridCellTextBlockStyle}"/>
</Border>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...