2009-05-26 42 views
42

पहले कुछ पृष्ठभूमि: मैं एक आवेदन पर काम कर रहा हूं और मैं इसे लिखने वाले एमवीवीएम सम्मेलनों का पालन करने की कोशिश कर रहा हूं। एक चीज जो मैं करना चाहता हूं वह एप्लिकेशन को मेरे आवेदन में अलग-अलग "खाल" देने में सक्षम होना है। एक ही आवेदन, लेकिन एक ग्राहक के लिए एक "त्वचा" और दूसरे के लिए एक अलग "त्वचा" दिखाएं।रनटाइम पर XAML लोड हो रहा है?

और इसलिए मेरे प्रश्न हैं:
1. क्या रन टाइम पर xaml फ़ाइल लोड करना संभव है और इसे मेरे ऐप पर "असाइन" करना संभव है?
2. क्या xaml फ़ाइल किसी बाहरी फ़ोल्डर में रहने वाली बाहरी फ़ाइल हो सकती है?
3. क्या एप्लिकेशन आसानी से किसी अन्य xaml फ़ाइल पर स्विच कर सकता है, या केवल स्टार्टअप समय पर?

तो मुझे इस पर जानकारी के लिए कहां देखना शुरू करना चाहिए? कौन सी डब्ल्यूपीएफ विधियां, यदि वे मौजूद हैं, तो इस कार्यक्षमता को संभालें?

धन्यवाद!

संपादित करें: "स्किनिंग" का प्रकार जो मैं करना चाहता हूं वह सिर्फ मेरे नियंत्रणों को देखने से ज्यादा है। विचार एक पूरी तरह से अलग यूआई है। विभिन्न बटन, विभिन्न लेआउट। किंडा जैसे ऐप का एक संस्करण विशेषज्ञों के लिए पूरी तरह से प्रदर्शित किया जाएगा और शुरुआती लोगों के लिए एक और संस्करण सरलीकृत किया जाएगा।

उत्तर

4

आप किसी भी XAML को लोड कर सकते हैं जिसे आप XamlReader.Load का उपयोग करना चाहते हैं।

यदि आप अपने एप्लिकेशन में अपने सभी नियंत्रणों को शैलीबद्ध करते हैं और उन शैलियों को अपने अनुप्रयोग संसाधन शब्दकोश में परिभाषित करते हैं तो आप XamlReader का उपयोग करके कहीं और XAML में परिभाषित नई शैलियों को लोड कर सकते हैं। लोड और XAML के साथ अपने संसाधन शब्दकोश के कुछ हिस्सों को प्रतिस्थापित करें। आपके नियंत्रण तदनुसार उपस्थिति बदल देंगे।

33

के रूप में जैकब क्रिस्टेंसेन बताया गया है, आप किसी भी XAML आप XamlReader.Load का उपयोग कर करना चाहते हैं लोड कर सकते हैं। यह केवल शैलियों के लिए लागू नहीं होता है, लेकिन UIElement एस भी है। आप बस एक्सएएमएल लोड करते हैं जैसे:

UIElement rootElement; 
FileStream s = new FileStream(fileName, FileMode.Open); 
rootElement = (UIElement)XamlReader.Load(s); 
s.Close(); 

फिर आप इसे उपयुक्त तत्व की सामग्री के रूप में सेट कर सकते हैं, उदा। के लिए

<Window x:Class="MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Title="Foo Bar"> 
    <Grid x:Name="layoutGrid"> 
     <!-- any static elements you might have --> 
    </Grid> 
</Window> 

आप के साथ grid में rootElement जोड़ सकते हैं:

layoutGrid.Children.Add(rootElement); 
layoutGrid.SetColumn(rootElement, COLUMN); 
layoutGrid.SetRow(rootElement, ROW); 

आप स्वाभाविक रूप से भी मैन्युअल रूप से कोड-पीछे rootElement अंदर तत्वों के लिए किसी भी घटनाओं को कनेक्ट करना होगा। उदाहरण के लिए, यह सोचते हैं अपने rootElement आप Path s 'MouseLeftButtonDown घटना इस तरह प्रदान कर सकते हैं Path एस के एक समूह के साथ एक Canvas होता है,:

Canvas canvas = (Canvas)LogicalTreeHelper.FindLogicalNode(rootElement, "canvas1"); 
foreach (UIElement ui in LogicalTreeHelper.GetChildren(canvas)) { 
    System.Windows.Shapes.Path path = ui as System.Windows.Shapes.Path; 
    if (path != null) { 
     path.MouseLeftButtonDown += this.LeftButtonDown; 
    } 
} 

मैं फ्लाई पर XAML फ़ाइलों स्विचन की कोशिश की नहीं है, इसलिए मैं यह नहीं कह सकता कि वह वास्तव में काम करेगा या नहीं।

+0

हाय TomiJ! ऐसा लगता है कि मैं क्या देख रहा हूं। मुझे लगता है कि एकमात्र बिट यह है कि समाधान का हिस्सा हैं .xaml फ़ाइलों को कैसे संभालना है। मैं कैसे जाऊं और उन्हें लोड करूं? – djcouchycouch

+0

मैं जिस ऐप्लिकेशन पर काम कर रहा हूं, मैं बस एक्सएएमएल फाइलों को समाधान में रखता हूं और अपनी बिल्ड एक्शन को "none" पर सेट करता हूं, और विजुअल स्टूडियो को आउटपुट निर्देशिका में फ़ाइलों को प्रतिलिपि बनाते हैं। उपरोक्त पहला कोड स्निपेट तब उन्हें लोड करने के लिए उपयोग किया जाएगा। –

+0

यहां मैं जो खोज रहा था, एक संसाधन के रूप में xaml को लोड करना http://msdn.microsoft.com/en-us/library/aa970494.aspx – djcouchycouch

4

मैं कार्यावधि में XAML लोड हो रहा है किया है, यहाँ एक छोटी उदाहरण है

Grid grd = new Grid(); 
var grdEncoding = new ASCIIEncoding(); 
var grdBytes = grdEncoding.GetBytes(myXAML); 
grd = (Grid)XamlReader.Load(new MemoryStream(grdBytes)); 
Grid.SetColumn(grd, 0); 
Grid.SetRow(grd, 0); 
parentGrid.Children.Add(grd); 

private String myXAML = @" <Grid xmlns='http://schemas.microsoft.com/winfx/2006/xaml/presentation' Margin='30 10 30 65' VerticalAlignment='Bottom'>" + 
        "<Label Content='Date: 1-Feb-2013' FontFamily='Arial' FontSize='12' Foreground='#666666' HorizontalAlignment='Left'/>" + 
        "<Label Content='4' FontFamily='Arial' FontSize='12' Foreground='#666666' HorizontalAlignment='Center'/>" + 
        "<Label Content='Hello World' FontFamily='Arial' FontSize='12' Foreground='#666666' HorizontalAlignment='Right'/>" + 
       "</Grid>"; 
4

मैं सरल मार्कअप विस्तार, XAML लोड करता है जो बनाया:

public class DynamicXamlLoader : MarkupExtension 
{ 
    public DynamicXamlLoader() { } 

    public DynamicXamlLoader(string xamlFileName) 
    { 
     XamlFileName = xamlFileName; 
    } 

    public string XamlFileName { get; set; } 

    public override object ProvideValue(IServiceProvider serviceProvider) 
    { 
     var provideValue = serviceProvider.GetService(typeof(IProvideValueTarget)) as IProvideValueTarget; 
     if (provideValue == null || provideValue.TargetObject == null) return null; 

     // get target 
     var targetObject = provideValue.TargetObject as UIElement; 
     if (targetObject == null) return null; 

     // get xaml file 
     var xamlFile = new DirectoryInfo(Directory.GetCurrentDirectory()) 
      .GetFiles(XamlFileName ?? GenerateXamlName(targetObject), SearchOption.AllDirectories) 
      .FirstOrDefault(); 

     if (xamlFile == null) return null; 

     // load xaml 
     using (var reader = new StreamReader(xamlFile.FullName)) 
      return XamlReader.Load(reader.BaseStream) as UIElement; 
    } 

    private static string GenerateXamlName(UIElement targetObject) 
    { 
     return string.Concat(targetObject.GetType().Name, ".xaml"); 
    } 
} 

उपयोग:

यह खोजने के लिए और MyFirstView.xaml फ़ाइल लोड करें

<ContentControl Content="{wpf:DynamicXamlLoader XamlFileName=MyFirstView.xaml}" /> 
,210

और यह भरने पूरे UserControl (खोजने के लिए और लोड MySecondView.xaml फ़ाइल)

<UserControl x:Class="MySecondView" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     Content="{wpf:DynamicXamlLoader}" /> 
संबंधित मुद्दे