يرتبط WPF الخاص بخاصية الوالدين من داخل العنصر المتداخل باستخدام النمط

StackOverflow https://stackoverflow.com/questions/3639537

  •  30-09-2019
  •  | 
  •  

سؤال

لقد كنت أحاول إنشاء مربع نص مع تلميح يتم عرضه بينما يكون فارغًا. أواجه مشكلة في ضبط نص التلميح من داخل النمط.

أن تكون دقيقًا ، هذا يعمل (أي أنه يرتبط بشكل صحيح):

    <TextBox Tag="hint text">
        <TextBox.Background>
            <VisualBrush Stretch="None">
                <VisualBrush.Visual>
                    <TextBlock Text="{Binding Tag, RelativeSource={RelativeSource AncestorType=TextBox}}" FontStyle="Italic" Foreground="LightGray" />
                </VisualBrush.Visual>
            </VisualBrush>
        </TextBox.Background>
    </TextBox>

لكن عندما أنقله إلى النمط ، لا:

<Style TargetType="TextBox" x:Key="stlHintbox">
    <Style.Triggers>
        <DataTrigger Binding="{Binding Text, RelativeSource={RelativeSource Mode=Self}}" Value="">
            <Setter Property="Background">
                <Setter.Value>
                    <VisualBrush Stretch="None">
                        <VisualBrush.Visual>
                            <TextBlock Tag="inner" Text="{Binding Tag, RelativeSource={RelativeSource AncestorType=TextBox}}" 
                                       FontStyle="Italic" Foreground="LightGray" />
                        </VisualBrush.Visual>
                    </VisualBrush>
                </Setter.Value>
            </Setter>
        </DataTrigger>
    </Style.Triggers>
</Style>

<TextBox Tag="hint text" Style="{StaticResource stlHintbox}" />

إذن ما هو الصيد؟ كيف يمكنني ربط خاصية الأجداد من داخل النمط؟

هل كانت مفيدة؟

المحلول

المشكلة ليست مع الأقارب ، ولكن مع الطريقة التي تستخدم بها البشرة المرئية. أذكر أن الأنماط تتم مشاركتها بين العناصر التي تطبقها عليها. السبب في أن مثالك لا ينجح هو أنه ، في الواقع ، تحاول مشاركة مربع نص واحد (جهاز "داخلي") مع مربعات نصية أصلية متعددة.

لمعرفة سبب وجود مشكلة ، جرب تجربة فكرية: يتم إنشاء مربع النص الداخلي مرة واحدة (بالمعنى الكلام ، سيحدث هذا عند إنشاء النمط). أي من مربعات النصوص التي يتم تطبيق النمط عليها يجب اختيارها كجداد لمربع النص الداخلي عند استخدام ملزمة للأقارب؟

هذا هو السبب datatemplates و ControlTemplates موجود في WPF. بدلاً من إنشاء صور مباشرة مباشرة ، فإنها تحدد قالبًا يسمح بإنشاء نسخ متعددة من الصور المرئية حسب الحاجة.

نصائح أخرى

Reativesource لا يعمل كما هو متوقع. من الأفضل إنشاء مربع نص مائي باستخدام قالب التحكم. لكن نسختك يمكن أن تعمل:

<Window.Resources>
    <Style TargetType="TextBox" x:Key="stlHintbox">
        <Style.Triggers>
            <DataTrigger Binding="{Binding Text, RelativeSource={RelativeSource Mode=Self}}" Value="">
                <Setter Property="TextBox.Background">
                    <Setter.Value>
                        <VisualBrush Stretch="None" Visual="{Binding ElementName=hintText}"/>
                    </Setter.Value>
                </Setter>
            </DataTrigger>
        </Style.Triggers>
    </Style>
</Window.Resources>
<StackPanel>
    <TextBox Tag="hint text" x:Name="myTextBox" Style="{StaticResource stlHintbox}" />
    <Border Visibility="Hidden">
        <TextBlock x:Name="hintText" Text="{Binding Tag, ElementName=myTextBox}" FontStyle="Italic" Foreground="LightGray" />
    </Border>
</StackPanel>
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top