2012-05-15 8 views
7

फेंकता है जब मैं एक ResourceDictionary के भीतर एक Setter के माध्यम से WindowStartupLocation गुण सेट करने का प्रयास, मैं एक XamlParseException मिलती है:ResourceDictionary से WindowStartupLocation स्थापना XamlParseException

'संपत्ति तय करें' System.Windows.Setter.Property 'एक अपवाद फेंक दिया । ' रेखा संख्या 'एक्स' और रेखा स्थिति 'वाई'।

भीतरी अपवाद एक ArgumentNullException है:

मूल्य खाली नहीं रह सकती। पैरामीटर नाम: संपत्ति।

संसाधन शब्दकोश के भीतर मेरे शैली है:

<Style TargetType="Window" x:Key="WindowStyle"> 
    <Setter Property="SizeToContent" Value="WidthAndHeight" /> 
    <Setter Property="ResizeMode" Value="CanMinimize" /> 
    <Setter Property="WindowStartupLocation" Value="CenterOwner" /> 
</Style> 

मुद्दा जब मैं WindowStartupLocation हटाने के बाद से ResourceDictionary, के उपयोग के साथ नहीं है, अन्य दो गुण (SizeToContent और ResizeMode) स्थापित कर रहे हैं जैसा कि विंडोज़ पर अपेक्षित है जो शैली का संदर्भ देता है:

<Window x:Class="WpfApplication1.MyWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     Style="{DynamicResource WindowStyle}"> 
    <Window.Resources> 
     <ResourceDictionary Source="MyResourceDictionary.xaml" /> 
    </Window.Resources> 
</Window> 

क्या किसी को इसका सामना करना पड़ा है? क्या यह डब्ल्यूपीएफ की एक बग/सीमा है?

पीएस मुझे पता है कि यह प्रश्न Window Startup Location from resource dictionary जैसा है, लेकिन दूसरे प्रश्न में पर्याप्त जानकारी प्रदान नहीं की गई जो बाद में अनसुलझा बनी रही।

उत्तर

8

समस्या यह है कि WindowStartupLocation एक निर्भरता प्रॉपर्टी नहीं है, इसलिए आप इसे स्टाइल सेटर में सेट नहीं कर सकते हैं। आईएलएसपी में देखकर सेटर

CheckValidProperty(DependencyProperty property) 

और एक NullArgumentException फेंकता है।

विंडोस्टार्टअप स्थान केवल एक सीएलआर संपत्ति है, इसे इस तरह से सेट नहीं किया जा सकता है।

Edit: टिप्पणी का जवाब देने के लिए।

<Application.Resources> 
    <ResourceDictionary> 
     <Style x:Key="WindowStyle" TargetType="Window"> 
      <Setter Property="SizeToContent" Value="WidthAndHeight" /> 
      <Setter Property="ResizeMode" Value="CanMinimize" /> 
     </Style> 
     <WindowStartupLocation x:Key="WSL">CenterOwner</WindowStartupLocation> 
    </ResourceDictionary> 
</Application.Resources> 

<Window x:Class="WpfApplication7.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"    
     WindowStartupLocation="{StaticResource WSL}" 
     Style="{StaticResource WindowStyle}" /> 
+0

तो तुम (का उपयोग कर एक CLR (गैर निर्भरता) XAML से सीधे गुण सेट करने की अनुमति है '<विंडो

यहाँ पूरा कोड है WindowStartupLocation = "CenterOwner" /> 'वाक्यविन्यास), लेकिन संसाधन शब्दकोश से नहीं, सही? – User3810621

+0

पूरी तरह से नहीं। आप सीधे एक्सएएमएल में संपत्ति सेट कर सकते हैं लेकिन आप अभी भी स्टाइल नहीं बल्कि संसाधन शब्दकोश का उपयोग कर सकते हैं। यही है, निम्नलिखित कार्य करता है: <अनुप्रयोग। स्रोत> <संसाधन डिक्शनरी> <शैली x: कुंजी = "विंडो स्टाइल" लक्ष्य प्रकार = "विंडो"> <सेटर संपत्ति = "आकार टॉकेंट" मान = "चौड़ाई और हाइट" /> <सेटर संपत्ति = "ResizeMode" मान = "CanMinimize" /> CenterOwner

+0

धन्यवाद, सबसे उपयोगी! दुर्भाग्यवश मैं 'स्टेटिक रिसोर्स' का उपयोग नहीं कर सकता क्योंकि मुझे 'विंडो' से 'संसाधन डिक्शनरी' का संदर्भ देने की आवश्यकता है (मैं एक ऑफिस एडिन विकसित कर रहा हूं जो मुझे एक WPF 'एप्लिकेशन' क्लास नहीं दे रहा है)। लेकिन विंडोज़ अनुप्रयोगों में डिफ़ॉल्ट शैली को केंद्रीकृत करने के लिए आपका सुझाव बहुत अच्छा होगा। – User3810621

5

WindowStartupLocation एक CLR संपत्ति है, इस ILSpy में देखा जा सकता:: आप अभी भी एक ResourceDictionary उपयोग कर सकते हैं

[DefaultValue(WindowStartupLocation.Manual)] 
public WindowStartupLocation WindowStartupLocation 
{ 
    get 
    { 
     this.VerifyContextAndObjectState(); 
     this.VerifyApiSupported(); 
     return this._windowStartupLocation; 
    } 

    set 
    { 
     this.VerifyContextAndObjectState(); 
     this.VerifyApiSupported(); 

     if (!Window.IsValidWindowStartupLocation(value)) 
     { 
      throw new InvalidEnumArgumentException("value", (int)value, typeof(WindowStartupLocation)); 
     } 

     this._windowStartupLocation = value; 
    } 
} 

शैली setters में केवल निर्भरता संपत्ति निर्दिष्ट किया जा सकता।

  • इनहेरिट वर्ग Window, और एक निर्भरता संपत्ति WindowStartupLocation

  • WindowStartupLocation आधार पर एक संलग्न संपत्ति प्रकार बनाने के साथ अपने वर्ग बना सकते हैं और PropertyChanged

  • में तर्क को परिभाषित: इस समस्या को हल करने के दो तरीके हैं

पहली विधि बोझिल है, क्योंकि एक संपत्ति के लिए कक्षा को फिर से परिभाषित करना आवश्यक है। दूसरी विधि को प्राथमिकता दी जाती है, और व्यवहार संलग्न होगा, लेकिन मैं PropertyExtension पर कॉल करूंगा।

namespace YourProject.PropertiesExtension 
{ 
    public static class WindowExt 
    { 
     public static readonly DependencyProperty WindowStartupLocationProperty; 

     public static void SetWindowStartupLocation(DependencyObject DepObject, WindowStartupLocation value) 
     { 
      DepObject.SetValue(WindowStartupLocationProperty, value); 
     } 

     public static WindowStartupLocation GetWindowStartupLocation(DependencyObject DepObject) 
     { 
      return (WindowStartupLocation)DepObject.GetValue(WindowStartupLocationProperty); 
     } 

     static WindowExt() 
     {    
      WindowStartupLocationProperty = DependencyProperty.RegisterAttached("WindowStartupLocation", 
                 typeof(WindowStartupLocation), 
                 typeof(WindowExt), 
                 new UIPropertyMetadata(WindowStartupLocation.Manual, OnWindowStartupLocationChanged)); 
     } 

     private static void OnWindowStartupLocationChanged(DependencyObject sender, DependencyPropertyChangedEventArgs e) 
     { 
      Window window = sender as Window; 

      if (window != null) 
      { 
       window.WindowStartupLocation = GetWindowStartupLocation(window); 
      } 
     } 
    } 
} 

का उपयोग करने का उदाहरण::

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
        xmlns:PropertiesExtension="clr-namespace:YourProject.PropertiesExtension"> 

    <Style TargetType="{x:Type Window}">    
     <Setter Property="PropertiesExtension:WindowExt.WindowStartupLocation" Value="CenterScreen" /> 
     <Setter Property="Width" Value="723" /> 
     <Setter Property="Height" Value="653" /> 
     <Setter Property="Title" Value="MainWindow title string" />  
    </Style> 
</ResourceDictionary> 
+0

सलाम बंद !! .. यह एक उचित समाधान है :) – Moumit

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