2011-01-04 13 views
7

मुझे एक बड़ी समस्या है कि XAML को डिज़ाइन-टाइम बनाम रन-टाइम में कैसे प्रस्तुत किया जाता है। अधिकांश भाग के लिए, चीजें सुसंगत होती हैं, लेकिन जब मैं किसी भी शैली का उपयोग करता हूं जिसमें ट्रिगर होता है, तो ट्रिगर को डिज़ाइन-टाइम में चेक नहीं किया जाता है।डब्ल्यूपीएफ डिजाइन-टाइम बनाम रन-टाइम स्टाइल मतभेद Triggers

<Window x:Class="DesignDifferencesWithDesignAndRuntime.MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Title="MainWindow" Height="400" Width="400"> 
<Window.Resources> 
    <Style x:Key="multiLineInTrigger" TargetType="{x:Type TextBox}"> 
     <Setter Property="HorizontalAlignment" Value="Left" /> 
     <Setter Property="VerticalAlignment" Value="Center" /> 
     <Setter Property="Width" Value="150" /> 
     <Setter Property="Height" Value="22" /> 
     <Setter Property="BorderBrush" Value="Blue" /> 
     <Setter Property="BorderThickness" Value="2" /> 
     <Style.Triggers> 
      <Trigger Property="AcceptsReturn" Value="True"> 
       <Setter Property="Width" Value="Auto" /> 
       <Setter Property="Height" Value="Auto" /> 
       <Setter Property="HorizontalAlignment" Value="Stretch" /> 
       <Setter Property="VerticalAlignment" Value="Stretch" /> 
      </Trigger> 
     </Style.Triggers> 
    </Style> 
    <Style x:Key="singleLineInTrigger" TargetType="{x:Type TextBox}"> 
     <Setter Property="HorizontalAlignment" Value="Left" /> 
     <Setter Property="Width" Value="Auto" /> 
     <Setter Property="Height" Value="Auto" /> 
     <Setter Property="HorizontalAlignment" Value="Stretch" /> 
     <Setter Property="VerticalAlignment" Value="Stretch" /> 
     <Setter Property="BorderBrush" Value="Blue" /> 
     <Setter Property="BorderThickness" Value="2" /> 
     <Style.Triggers> 
      <Trigger Property="AcceptsReturn" Value="False"> 
       <Setter Property="Width" Value="150" /> 
       <Setter Property="Height" Value="22" /> 
       <Setter Property="HorizontalAlignment" Value="Left" /> 
       <Setter Property="VerticalAlignment" Value="Center" /> 
      </Trigger> 
     </Style.Triggers> 
    </Style> 
    <Style TargetType="{x:Type TextBlock}"> 
     <Setter Property="FontWeight" Value="Bold" /> 
     <Setter Property="HorizontalAlignment" Value="Right" /> 
    </Style> 
</Window.Resources> 
<Grid> 
    <Grid.ColumnDefinitions> 
     <ColumnDefinition Width="150" /> 
     <ColumnDefinition Width="*" /> 
    </Grid.ColumnDefinitions> 
    <Grid.RowDefinitions> 
     <RowDefinition Height="Auto" /> 
     <RowDefinition Height="Auto" /> 
     <RowDefinition Height="*" /> 
     <RowDefinition Height="*" /> 
    </Grid.RowDefinitions> 

    <TextBlock Text="Single (Single Style)" Grid.Row="0" Grid.Column="0" /> 
    <TextBlock Text="Single (Multi Style)" Grid.Row="1" Grid.Column="0" /> 
    <TextBlock Text="Multi (Single Style)" Grid.Row="2" Grid.Column="0" /> 
    <TextBlock Text="Multi (Multi Style)" Grid.Row="3" Grid.Column="0" /> 

    <TextBox Grid.Row="0" Grid.Column="1" Style="{StaticResource singleLineInTrigger}" /> 
    <TextBox Grid.Row="1" Grid.Column="1" Style="{StaticResource multiLineInTrigger}" /> 
    <TextBox Grid.Row="2" Grid.Column="1" Style="{StaticResource singleLineInTrigger}" AcceptsReturn="True" /> 
    <TextBox Grid.Row="3" Grid.Column="1" Style="{StaticResource multiLineInTrigger}" AcceptsReturn="True" /> 
</Grid> 

मैं दो अलग-अलग पाठ बॉक्स शैलियों जो ठीक उसी काम करते हैं बनाया:

यहाँ कैसे कुछ अलग प्रदर्शित किए जाते हैं दिखाने के लिए एक नमूना अनुप्रयोग है। जब टेक्स्टबॉक्स सिंगल-लाइन होता है (AcceptsReturn = False) मुझे चौड़ाई 150 की आवश्यकता होती है, और ऊंचाई 22 होनी चाहिए। जब ​​यह मल्टी-लाइन (AcceptsReturn = True, जाहिर है) मुझे चौड़ाई और ऊंचाई को खींचने और लेने की आवश्यकता है पूरी जगह ऊपर।

इनमें से दोनों ट्रिगर्स रन-टाइम में पूरी तरह से काम करते हैं, क्योंकि यह कोड दिखाएगा, लेकिन डिज़ाइन-टाइम में वे दोनों ट्रिगर की स्थिति पर काम करने में विफल रहते हैं। "MultiLineInTrigger" शैली का उपयोग करते समय, टेक्स्टबॉक्स में ऊंचाई और चौड़ाई स्थिर रूप से सेट की जाएगी (AcceptsReturn की परवाह किए बिना), लेकिन "सिंगललाइनइन ट्रिगर" शैली का उपयोग करते समय, AcceptsReturn मान के बावजूद नियंत्रण बढ़ाया जाएगा।

क्या इस मुद्दे के लिए कोई समाधान है? यह विकास टीम के लिए काफी परेशानी और समय लेने वाला बन गया है क्योंकि उन्हें पता नहीं है कि यह काम कर रहा है जब यह संकलन और आवेदन (जब एक लंबी प्रक्रिया है) तक नहीं है।

धन्यवाद।

+0

डिज़ाइन का समय धारणा है कि आप वीएस -2010 बनाम अभिव्यक्ति मिश्रण का संदर्भ दे रहे हैं? –

+1

1) समाधान को फिर से बनाने का प्रयास करें और जांचें, यह पहला विकल्प है। 2) टेक्स्टबॉक्स से उप-वर्ग द्वारा कस्टम टेक्स्टबॉक्स बनाएं। OnApplyTemplate में इस शैली को कोड ब्लॉक DesignerProperties.GetIsInDesignMode() के अंतर्गत लागू करें। तो, इस शैली को डिजाइन मोड में अकेले लागू किया जाएगा। इस कस्टम टेक्स्टबॉक्स का प्रयोग करें। आप कर चुके हैं। –

+0

@Aaron, हां, यह विजुअल स्टूडियो 2010 में है, अभिव्यक्ति नहीं। – Travis

उत्तर

5

मैंने इस समस्या को कई बार देखा है और मैंने कभी इसके लिए कोई काम नहीं देखा है, ट्रिगर्स विजुअल स्टूडियो 2010 डिज़ाइनर में काम नहीं करता है। उम्मीद है कि वे जल्द ही यह तय कर सकते हैं।

एकमात्र समाधान मैं सोच सकता हूं कि अभिव्यक्ति मिश्रण 4 में डिज़ाइन कार्य करना है, जहां यह पूरी तरह से काम करता है। आदर्श नहीं हो सकता है लेकिन फिलहाल मुझे नहीं लगता कि आपके पास कोई अन्य choise

+0

मुझे डर था कि यह मामला हो सकता है। जानकारी के लिए धन्यवाद, मैं अभिव्यक्ति मिश्रण की जांच करूंगा और देख सकता हूं कि यह औसत समय में एक समाधान है या नहीं। – Travis

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