هل يمكنك تحديد TargetTypes متعددة لنمط XAML واحد؟

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

  •  03-07-2019
  •  | 
  •  

سؤال

في HTML/CSS، يمكنك تحديد نمط يمكن تطبيقه على العديد من أنواع العناصر، على سبيل المثال:

.highlight {
    color:red;
}

يمكن تطبيقها على كل من P وDIV، على سبيل المثال:

<p class="highlight">this will be highlighted</p>
<div class="highlight">this will also be highlighted</div>

ولكن في XAML يبدو أنه يتعين عليك تحديد TargetType للأنماط، وإلا فستحصل على خطأ:

<Style x:Key="formRowLabel" TargetType="TextBlock">

هل هناك طريقة للسماح بتطبيق نمط XAML على عناصر متعددة أو حتى تركه مفتوحًا كما هو الحال في CSS؟

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

المحلول

ويتم التحقق من واضعي في أنماط WPF خلال وقت الترجمة. يتم تطبيق الأنماط CSS بشكل حيوي.

لديك لتحديد نوع بحيث يمكن WPF حل الخصائص في اضعي إلى خصائص التبعية من هذا النوع.

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

<Style x:Key="Highlight" TargetType="{x:Type Control}">
    <Setter Property="Foreground" Value="Red"/>
</Style>

...

<Button Style="{StaticResource Highlight}" Content="Test"/>
<TextBox Style="{StaticResource Highlight}" Text="Test"/>
<CheckBox Style="{StaticResource Highlight}" Content="Test"/>

نصائح أخرى

<!-- Header text style -->
<Style x:Key="headerTextStyle">
    <Setter Property="Label.VerticalAlignment" Value="Center"></Setter>
    <Setter Property="Label.FontFamily" Value="Trebuchet MS"></Setter>
    <Setter Property="Label.FontWeight" Value="Bold"></Setter>
    <Setter Property="Label.FontSize" Value="18"></Setter>
    <Setter Property="Label.Foreground" Value="#0066cc"></Setter>
</Style>

<!-- Label style -->
<Style x:Key="labelStyle" TargetType="{x:Type Label}">
    <Setter Property="VerticalAlignment" Value="Top" />
    <Setter Property="HorizontalAlignment" Value="Left" />
    <Setter Property="FontWeight" Value="Bold" />
    <Setter Property="Margin" Value="0,0,0,5" />
</Style>

وأعتقد أن كلا من هذه الطرق من الاعلان عن أسلوب قد الإجابة على سؤالك. في أول واحد، لا يوجد TargetType محدد، ولكن تكون مسبوقة أسماء الخصائص مع "تسمية". في ثانية واحدة، يتم إنشاء أسلوب للكائنات تسمية.

وهناك طريقة أخرى للقيام بذلك هو:

<UserControl.Resources>
  <Style x:Key="commonStyle" TargetType="Control">
     <Setter Property="FontSize" Value="24"/>
  </Style>
  <Style BasedOn="{StaticResource commonStyle}" TargetType="ListBox"/>
  <Style BasedOn="{StaticResource commonStyle}" TargetType="ComboBox"/>
</UserControl.Resources>

كنت أرغب في تطبيق نمط على Textblock وTextBox ولكن الإجابة المحددة لم تنجح بالنسبة لي لأن Textblock لا يرث من التحكم، وفي حالتي أردت التأثير على خاصية الرؤية، لذلك استخدمت FrameworkElement

<Style x:Key="ShowIfRequiredStyle" TargetType="{x:Type FrameworkElement}">
        <Setter Property="Visibility" Value="Collapsed"/>
        <Style.Triggers>
            <DataTrigger Binding="{Binding ShowIfRequiredStyle, UpdateSourceTrigger=PropertyChanged}" Value="true">
                <Setter Property="Visibility" Value="Visible"/>
            </DataTrigger>
        </Style.Triggers>
</Style>

<TextBlock Style="{StaticResource ResourceKey=ShowIfRequiredStyle}"/>
<TextBox Style="{StaticResource ResourceKey=ShowIfRequiredStyle}"/>

يعمل هذا مع خاصية الرؤية لأن كلا العنصرين يرثان من Frameworkelement ويتم تعريف الخاصية هناك.بالطبع لن يعمل هذا مع الخصائص المحددة فقط في عنصر التحكم، يمكنك البحث في شجرة التسلسل الهرمي ومحاولة العثور على فئة أساسية، على أي حال اعتقدت أن هذا يمكن أن يساعد شخصًا ما نظرًا لأن هذه نتيجة بحث عليا والإجابة المحددة غير مكتملة بعض الشيء.

وهناك إجابة بديلة لهذه المسألة. يمكنك ترك المعلمة TargetType من النمط تماما والتي سوف تسمح لها أن تنطبق على مختلف ضوابط مختلفة، ولكن فقط إذا كنت بادئة اسم الخاصية مع "السيطرة".

<Style x:Key="Highlight">
    <Setter Property="Control.Foreground" Value="Red"/> 
</Style> 

ومن الواضح أن هذا يعمل فقط لخصائص الفئة سيطرة القاعدة. إذا حاولت تعيين ItemsSource القول، أنه سيفشل لأنه لا يوجد Control.ItemsSource

وحصلت على هذا العمل

<Style x:Key="HeaderStyleThin"  TargetType="{x:Type Border}">
    <Setter Property="Background" Value="Black" />

    <Style.Resources>
        <Style TargetType="{x:Type TextBlock}">
               <Setter Property="Background=" Value="Red" />
        </Style>
        </Style.Resources>

</Style>
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top