Member 11859517 Ответов: 2

Как установить содержимое метки динамически(из кода позади) в C# WPF


Я создаю текстовое поле динамически и применяю стиль для текста водяного знака. он работает нормально, но текст отображается как метка водяного знака(только числовая), которая жестко закодирована в моем стиле, который я хочу установить в коде позади,
ниже приведен мой стиль. Я хочу передать его из codebehind.
спасибо.

Что я уже пробовал:

<Style x:Key="onlyNumericTextboxStyle" TargetType="{x:Type TextBox}">
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="{x:Type TextBox}">
                        <Grid>
                            <Border Background="{TemplateBinding Background}" BorderBrush="#FF97A0A5" BorderThickness="1" SnapsToDevicePixels="True">
                                <ScrollViewer x:Name="PART_ContentHost" Margin="0,0,0,0" VerticalAlignment="Center" />
                            </Border>
                            <Label x:Uid="UsernameText" x:Name="WaterMarkLabel" Content="Only Numeric"
                               Visibility="Collapsed" Foreground="#1a1a1a" FontSize="10" Opacity="0.5"
                                   FontStyle="Italic"/>
                        </Grid>
                        <ControlTemplate.Triggers>
                            <MultiTrigger>
                                <MultiTrigger.Conditions>
                                    <Condition Property="Text" Value=""/>
                                </MultiTrigger.Conditions>
                                <Setter Property="Visibility" TargetName="WaterMarkLabel" Value="Visible"/>
                            </MultiTrigger>
                            <Trigger Property="IsEnabled" Value="False">
                                <Setter Property="Foreground" Value="DimGray"/>
                            </Trigger>
                        </ControlTemplate.Triggers>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>

2 Ответов

Рейтинг:
2

Alex Schunk

Если бы он был в ControlTemplate, это было бы грязно... Я бы этого не рекомендовал. Вам придется найти этот конкретный элемент управления в применяемом шаблоне, и это будет стоить вам очень дорого.
Вместо этого используйте привязки или поведение...

И второе... Не используйте ярлыки, используйте текстовые блоки.


Graeme_Grant

Полностью согласен. Ему потребуется рабочий пример для этого решения, чтобы помочь любому.

Однако лично я бы унаследовал текстовое поле и создал класс управления Watermark lookless. Однако это выходит за рамки данного вопроса.

Рейтинг:
1

Graeme_Grant

Вот рабочая версия того, что вы пытаетесь сделать:

<Window x:Class="MainWindow"

        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"



        Title="Watermark Textbox demo" Height="350" Width="525">

    <Window.Resources>

        <SolidColorBrush x:Key="TextBox.Static.Border" Color="#FFABAdB3"/>
        <SolidColorBrush x:Key="TextBox.MouseOver.Border" Color="#FF7EB4EA"/>
        <SolidColorBrush x:Key="TextBox.Focus.Border" Color="#FF569DE5"/>

        <Style x:Key="CommandTextBoxStyle" TargetType="{x:Type TextBox}">
            <Setter Property="Background"

                    Value="{DynamicResource {x:Static SystemColors.WindowBrushKey}}"/>
            <Setter Property="BorderBrush"

                    Value="{StaticResource TextBox.Static.Border}"/>
            <Setter Property="Foreground"

                    Value="{DynamicResource {x:Static
                                                 SystemColors.ControlTextBrushKey}}"/>
            <Setter Property="BorderThickness" Value="1"/>
            <Setter Property="KeyboardNavigation.TabNavigation" Value="None"/>
            <Setter Property="HorizontalContentAlignment" Value="Left"/>
            <Setter Property="FocusVisualStyle" Value="{x:Null}"/>
            <Setter Property="AllowDrop" Value="true"/>
            <Setter Property="ScrollViewer.PanningMode" Value="VerticalFirst"/>
            <Setter Property="Stylus.IsFlicksEnabled" Value="False"/>
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="{x:Type TextBox}">
                        <Border x:Name="border"

                                BorderBrush="{TemplateBinding BorderBrush}"

                                BorderThickness="{TemplateBinding BorderThickness}"

                                Background="{TemplateBinding Background}"

                                SnapsToDevicePixels="True">
                            <Grid>
                                <ScrollViewer x:Name="PART_ContentHost"

                                              Focusable="false"

                                              HorizontalScrollBarVisibility="Hidden"

                                              VerticalScrollBarVisibility="Hidden"/>

                                <TextBlock IsHitTestVisible="False"

                                           Margin="{TemplateBinding Padding}"

                                           Text="Watermark text goes here"

                                           TextTrimming="CharacterEllipsis"

                                           FontStyle="Italic" Foreground="LightGray"

                                           DataContext="{Binding RelativeSource=
                                               {RelativeSource Mode=FindAncestor,
                                                               AncestorType=TextBox}}">
                                    <TextBlock.Style>
                                        <Style TargetType="{x:Type TextBlock}">
                                            <Setter Property="Visibility" 

                                                    Value="Collapsed"/>
                                            <Style.Triggers>
                                                <MultiDataTrigger>
                                                    <MultiDataTrigger.Conditions>
                                                        <Condition Binding="{Binding 
                                                                   Text}" Value=""/>
                                                        <Condition Binding="{Binding 
                                                                   IsKeyboardFocused}"

                                                                   Value="False"/>
                                                    </MultiDataTrigger.Conditions>
                                                    <MultiDataTrigger.Setters>
                                                        <Setter Property="Visibility" 

                                                                Value="Visible"/>
                                                    </MultiDataTrigger.Setters>
                                                </MultiDataTrigger>
                                            </Style.Triggers>
                                        </Style>
                                    </TextBlock.Style>
                                </TextBlock>

                            </Grid>
                        </Border>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
            <Style.Triggers>
                <MultiTrigger>
                    <MultiTrigger.Conditions>
                        <Condition Property="IsInactiveSelectionHighlightEnabled" 

                                   Value="true"/>
                        <Condition Property="IsSelectionActive" Value="false"/>
                    </MultiTrigger.Conditions>
                    <Setter Property="SelectionBrush"

                            Value="{DynamicResource {x:Static 
                                  SystemColors.InactiveSelectionHighlightBrushKey}}"/>
                </MultiTrigger>
            </Style.Triggers>
        </Style>

    </Window.Resources>

    <Grid HorizontalAlignment="Center">
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="Auto"/>
            <ColumnDefinition Width="Auto"/>
        </Grid.ColumnDefinitions>
        <TextBox Width="200" VerticalAlignment="Center" Padding="4"

                 Style="{DynamicResource CommandTextBoxStyle}"/>
        <Button Content="Search"

                Margin="10 0" Padding="10 5"

                Grid.Column="1" VerticalAlignment="Center"/>
    </Grid>

</Window>


Member 11859517

Спасибо Graeme_Grant за ваш ответ,
но я хочу установить текст водяного знака из кода позади. как это сделать?

Graeme_Grant

Решением было бы создать подклассный пользовательский элемент управления элемента управления TextBox и предоставить свойство зависимости WatermarkText. Прочтите эту статью, чтобы узнать, как это сделать: Простейшее свойство зависимостей WPF для начинающих на 'ValidState'[^]

Тем не менее, это все еще возможно сделать и таким образом. Вам нужно будет дождаться, пока элемент управления применит шаблон, затем пройти по визуальному дереву, пока вы не найдете текстовый блок водяного знака, а затем установить свойство text.