2009-06-28 16 views
18

मैं अपने WPF आवेदन में ध्यान केंद्रित आयतों को निष्क्रिय विश्व स्तर पर करना चाहते हैं।निष्क्रिय FocusVisualStyle विश्व स्तर पर

<Style TargetType="Button"> 
    <Setter Property="FocusVisualStyle" Value="{x:Null}" /> 
</Style> 

के माध्यम से किए जा सकने वाले एकल नियंत्रणों के लिए, लेकिन मेरे आवेदन में सभी नियंत्रणों पर इसे कैसे लागू किया जाए। फ्रेमवर्क एलिमेंट पर आवेदन करते समय कुछ भी नहीं होता है। मुझे जो चाहिए वह "वर्ग एक्स और सभी व्युत्पन्न कक्षाओं पर लागू" जैसा होगा।

अग्रिम धन्यवाद,

स्टीफन

उत्तर

0

यह सरल नहीं हो सकता है, लेकिन आप एक समारोह है कि एक नियंत्रण की मौजूदा शैली को बदल देता है लिख सकते हैं। एक बार लिखा जाने के बाद, आप एक ऐसा फ़ंक्शन लिख सकते हैं जो प्रत्येक तत्व की शैली को दोबारा बदल देता है।

+0

क्यों ऐसा किया एक -1 प्राप्त करें? –

+0

शायद क्योंकि यह अनावश्यक रूप से जटिल है, कठिनाइयों से भरा हुआ है जैसे कि सुनिश्चित करना कि आपने हर किनारे के मामले को संभवतः कवर किया है और बनाए रखने के लिए काफी कठिन है, केवल 2 नाम के लिए। प्रत्येक प्रकार के लिए 'स्टाइल' और 'सेटर' की तुलना में (हालांकि, हालांकि थकाऊ, सरल है), आपका सुझाव पागल लगता है। मैंने -1 नहीं दिया। –

+0

चूंकि उन्होंने कोई टिप्पणी नहीं की है कि कोई भी समाधान काम करेगा, हम नहीं जानते कि अन्य विचारों में मदद मिली है या नहीं। यदि यह एकमात्र विचार है जो उनकी जरूरतों को पूरा करता है, तो "पागल" एक गलत चित्रण होगा। –

0

आप OverrideMetadata उपयोग कर सकते हैं: इससे पहले कि आप किसी भी तत्व बनाई गई है इस कॉल करनी होगी

FrameworkElement.FocusVisualStyleProperty.OverrideMetadata(
    typeof(FrameworkElement), 
    new FrameworkPropertyMetadata(null)); 
  1. , Application.Startup घटना शायद सबसे अच्छी जगह है।
  2. यह होगा कि FrameworkElement का ध्यान दृश्य शैली का उपयोग करें और नियंत्रण है कि यह कोड या शैलियों में ओवरराइड नहीं बदलेगा तभी प्रभावी नियंत्रण।
  3. मैं नहीं की कोशिश करता अपने आप
+0

दुर्भाग्य से इसका परिणाम "PropertyMetadata पहले से ही 'फ्रेमवर्क एलिमेंट' – grayscales

+2

के लिए पंजीकृत है" ओवरराइड मेटाडेटा को कॉल केवल उस प्रकार के स्थिर रचनाकारों के भीतर किया जाना चाहिए जो स्वयं को इस विधि के टाइप प्रकार पैरामीटर के रूप में या समान तत्कालता के माध्यम से प्रदान करते हैं। "Http : //msdn.microsoft.com/en-us/library/ms597491.aspx –

1

मैं इसे कठिन लगता है FocusVisualStyle के साथ ऐसा करने के लिए है, लेकिन आप शायद, अन्य सभी नियंत्रण प्रकार के लिए एक ही बात करने के लिए अलग-अलग होगा। उनमें से एक सूची बनाना और कुछ सरल खोज/प्रतिस्थापन संचालन करना आपको जो चाहिए, उसे प्राप्त करना चाहिए।

3

ऐसा लगता है कि इसके लिए कोई जादुई गोली है जैसे:

<Style x:Key="{x:Static SystemParameters.FocusVisualStyleKey}"> 
    <Setter Property="Control.Template"> 
    <Setter.Value> 
     <ControlTemplate> 
     <Rectangle StrokeThickness="1" 
      Stroke="Black" 
      StrokeDashArray="1 2" 
      SnapsToDevicePixels="true"/> 
     </ControlTemplate> 
    </Setter.Value> 
    </Setter> 
</Style> 

मैं परीक्षण नहीं किया:

http://social.msdn.microsoft.com/Forums/en-US/wpf/thread/141c8bfa-f152-4f8a-aca0-3c3b5440d183

3

http://msdn.microsoft.com/en-us/library/bb613567.aspx के अनुसार, अगर आप इस तरह वैश्विक फोकस शैली स्थापित करने के लिए सक्षम होना चाहिए यह, लेकिन मुझे लगता है कि जब आप controltemplate खाली करते हैं, तो यह पूरे ऐप के लिए फ़ोकस आयताकार को प्रभावी ढंग से अक्षम कर देगा (बशर्ते आप इस शैली को app.xaml में शामिल करें)।

+6

काम नहीं करता है :( – arolson101

0

Window कक्षा के लिए डिफ़ॉल्ट Template का हिस्सा AdornerDecorator है। आप Window के डिफ़ॉल्ट Template ओवरराइड तो एक AdornerDecorator, सभी नियंत्रण दिखाई नहीं देगा पर FocusVisualStyle शामिल नहीं करने के लिए।

यहां तक ​​कि अगर एक Control एक वैध FocusVisualStyle कि एक Template सेट है, यह AdornerDecorator बिना दिखाई नहीं देगा।

इसे पूरा करने का एक आसान तरीका यह है कि के तहत अपनी App.xaml फ़ाइल में यह Style शामिल करना है।

<Style TargetType="{x:Type Window}"> 
    <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.WindowTextBrushKey}}"/> 
    <Setter Property="Background" Value="{DynamicResource {x:Static SystemColors.WindowBrushKey}}"/> 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="{x:Type Window}"> 
       <Border BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}"> 
        <ContentPresenter ContentTemplate="{TemplateBinding ContentTemplate}" Content="{TemplateBinding Content}" ContentStringFormat="{TemplateBinding ContentStringFormat}"/> 
       </Border> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
    <Style.Triggers> 
     <Trigger Property="ResizeMode" Value="CanResizeWithGrip"> 
      <Setter Property="Template"> 
       <Setter.Value> 
        <ControlTemplate TargetType="{x:Type Window}"> 
         <Border BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}"> 
          <Grid> 
           <ContentPresenter ContentTemplate="{TemplateBinding ContentTemplate}" Content="{TemplateBinding Content}" ContentStringFormat="{TemplateBinding ContentStringFormat}"/> 
           <ResizeGrip x:Name="WindowResizeGrip" HorizontalAlignment="Right" IsTabStop="False" Visibility="Collapsed" VerticalAlignment="Bottom"/> 
          </Grid> 
         </Border> 
         <ControlTemplate.Triggers> 
          <MultiTrigger> 
           <MultiTrigger.Conditions> 
            <Condition Property="ResizeMode" Value="CanResizeWithGrip"/> 
            <Condition Property="WindowState" Value="Normal"/> 
           </MultiTrigger.Conditions> 
           <Setter Property="Visibility" TargetName="WindowResizeGrip" Value="Visible"/> 
          </MultiTrigger> 
         </ControlTemplate.Triggers> 
        </ControlTemplate> 
       </Setter.Value> 
      </Setter> 
     </Trigger> 
    </Style.Triggers> 
</Style> 
0

मैं भी इस पर ठोकर खाई और इस के साथ (वास्तव में नहीं बहुत अच्छा है लेकिन प्रभावी) आया समाधान:

public class FocusVisualStyleRemover 
{ 
    static FocusVisualStyleRemover() 
    { 
    EventManager.RegisterClassHandler(typeof(FrameworkElement), FrameworkElement.GotFocusEvent, new RoutedEventHandler(RemoveFocusVisualStyle), true); 
    } 

    public static void Init() 
    { 
    // intentially empty 
    } 

    private static void RemoveFocusVisualStyle(object sender, RoutedEventArgs e) 
    { 
    (sender as FrameworkElement).FocusVisualStyle = null; 
    } 
} 

मेरी MainWindow के निर्माता में मैं तो बस फोन FocusVisualStyleRemover.Init();

संबंधित मुद्दे