2009-09-25 12 views
10

alt text http://img42.imageshack.us/img42/4161/blinkthru.pngडब्ल्यूपीएफ - मैं एक adornedElementPlaceholder पर उपयोगकर्ता नियंत्रण कैसे रख सकता हूं?

मैं अपने कस्टम मोडल संवाद के माध्यम से दिखाने के लिए सत्यापन प्राप्त करने का प्रयास कर रहा हूं। मैंने इस टेम्पलेट में संवाद और तत्वों के ज़िन्डेक्स को सेट करने का प्रयास किया है। कोई विचार?

यह एक मान्यता टेम्पलेट से आ रही है:

<ControlTemplate x:Key="ValidationTemplate"> 
     <DockPanel> 
      <TextBlock Foreground="Red" FontSize="20" Panel.ZIndex="-10">!</TextBlock> 
      <Border Name="validationBorder" BorderBrush="Red" BorderThickness="2" Padding="1" CornerRadius="3" Panel.ZIndex="-10"> 
       <Border.Resources> 
        <Storyboard x:Key="_blink"> 
         <ColorAnimationUsingKeyFrames AutoReverse="True" BeginTime="00:00:00" Storyboard.TargetName="validationBorder" Storyboard.TargetProperty="(Border.BorderBrush).(SolidColorBrush.Color)" RepeatBehavior="Forever"> 
          <SplineColorKeyFrame KeyTime="00:00:1" Value="#00FF0000"/> 
         </ColorAnimationUsingKeyFrames> 
        </Storyboard> 
       </Border.Resources> 
       <Border.Triggers> 
        <EventTrigger RoutedEvent="FrameworkElement.Loaded"> 
         <BeginStoryboard Storyboard="{StaticResource _blink}" /> 
        </EventTrigger> 
       </Border.Triggers> 
       <AdornedElementPlaceholder/> 
      </Border> 
     </DockPanel> 
    </ControlTemplate> 

संवाद:

<UserControl 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
    x:Class="GunMiser.Controls.PendingChangesConfirmationDialog" 
    Height="768" Width="1024" mc:Ignorable="d"> 
    <Grid Background="White"> 
     <Rectangle x:Name="MainRectangle" Margin="0,0,0,0" Style="{DynamicResource UserControlOverlayRectangleStyle}" Opacity="0.85"/> 
     <Border Margin="288,250,278,288" Background="#FF868686" BorderBrush="Black" BorderThickness="1"> 
      <Border.Effect> 
       <DropShadowEffect Color="#FFB6B2B2"/> 
      </Border.Effect> 
      <TextBlock x:Name="textBlockMessage" Margin="7,29,7,97" TextWrapping="Wrap" d:LayoutOverrides="VerticalAlignment" TextAlignment="Center"/> 
     </Border> 
     <Button x:Name="OkButton" Click="OkButton_Click" Margin="313,0,0,328" VerticalAlignment="Bottom" Height="24" Content="Save Changes" Style="{DynamicResource GunMiserButtonStyle}" HorizontalAlignment="Left" Width="103"/> 
     <Button Click="CancelButton_Click" Margin="453.294,0,456,328" VerticalAlignment="Bottom" Height="24" Content="Cancel Changes" Style="{DynamicResource GunMiserButtonStyle}"/> 
     <Button Click="CancelActionButton_Click" Margin="0,0,304,328" VerticalAlignment="Bottom" Height="24" Content="Go Back" Style="{DynamicResource GunMiserButtonStyle}" HorizontalAlignment="Right" Width="114.706"/> 
    </Grid> 
</UserControl> 

और समग्र खिड़की है:

<Window x:Class="GunMiser.Views.Shell" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:cal="http://www.codeplex.com/CompositeWPF" 
    xmlns:controls="clr-namespace:GunMiser.Controls;assembly=GunMiser.Controls" 
    Title="Gun Miser" 
    Height="768" Width="1024"> 
    <Canvas> 
     <controls:PendingChangesConfirmationDialog x:Name="PendingChangesConfirmationDialog" HorizontalAlignment="Stretch" Margin="0,0,0,0" VerticalAlignment="Stretch" Width="1008" Height="730" Visibility="Collapsed" Panel.ZIndex="100" /> 
     <ContentControl x:Name="FilterRegion" cal:RegionManager.RegionName="FilterRegion" Width="326" Height="656" Canvas.Top="32" VerticalAlignment="Top" HorizontalAlignment="Left" /> 
     <ContentControl Name="WorkspaceRegion" cal:RegionManager.RegionName="WorkspaceRegion" Width="678" Height="726" Canvas.Left="330" VerticalAlignment="Top" HorizontalAlignment="Left"/> 
     <Button Click="GunsButton_Click" Width="75" Height="25" Content="Guns" Canvas.Top="3" Style="{DynamicResource GunMiserButtonStyle}"/> 
     <Button Click="OpticsButton_Click" Width="75" Height="25" Content="Optics" Canvas.Left="81" Canvas.Top="3" Style="{DynamicResource GunMiserButtonStyle}"/> 
     <Button Click="SettingsButton_Click" Width="56" Height="28" Content="Settings" Canvas.Left="944" Style="{DynamicResource GunMiserButtonStyle}" HorizontalAlignment="Left" VerticalAlignment="Top"/> 
     <Button Click="AccessoriesButton_Click" Width="75" Height="25" Content="Accessories" Canvas.Left="239" Canvas.Top="3" Style="{DynamicResource GunMiserButtonStyle}"/> 
     <Button Click="AmmunitionButton_Click" Width="75" Height="25" Content="Ammunition" Canvas.Left="160" Canvas.Top="3" Style="{DynamicResource GunMiserButtonStyle}"/> 

    </Canvas> 
</Window> 
+0

http://stackoverflow.com/questions/321327/how-do-i-get-rid-of-the-red-rectangle-when-my-wpf-binding-validation-has-failed- ए - डोननेल के जवाब ने एक विस्तारक के लिए मदद की जिसमें मुझे समस्याएं थीं। – Aligned

उत्तर

13

आप समस्या है कि त्रुटि टेम्पलेट है एडॉर्नर परत में दिखाया गया है जो आपके मामले में रूट विंडो पर होगा।

यदि आप निम्नलिखित में अपना कोड बदलना चाहते हैं तो आपको कोई समस्या नहीं होगी, क्योंकि आपके बाकी नियंत्रणों के आसपास एक अलग एडॉर्नर परत बनाई जाएगी।

<Window x:Class="GunMiser.Views.Shell" 
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
xmlns:cal="http://www.codeplex.com/CompositeWPF" 
xmlns:controls="clr-namespace:GunMiser.Controls;assembly=GunMiser.Controls" 
Title="Gun Miser" 
Height="768" Width="1024"> 
<Canvas>   
    <AdornerDecorator> 
     <Canvas> 
      <ContentControl x:Name="FilterRegion" cal:RegionManager.RegionName="FilterRegion" Width="326" Height="656" Canvas.Top="32" VerticalAlignment="Top" HorizontalAlignment="Left" /> 
      <ContentControl Name="WorkspaceRegion" cal:RegionManager.RegionName="WorkspaceRegion" Width="678" Height="726" Canvas.Left="330" VerticalAlignment="Top" HorizontalAlignment="Left"/> 
      <Button Click="GunsButton_Click" Width="75" Height="25" Content="Guns" Canvas.Top="3" Style="{DynamicResource GunMiserButtonStyle}"/> 
      <Button Click="OpticsButton_Click" Width="75" Height="25" Content="Optics" Canvas.Left="81" Canvas.Top="3" Style="{DynamicResource GunMiserButtonStyle}"/> 
      <Button Click="SettingsButton_Click" Width="56" Height="28" Content="Settings" Canvas.Left="944" Style="{DynamicResource GunMiserButtonStyle}" HorizontalAlignment="Left" VerticalAlignment="Top"/> 
      <Button Click="AccessoriesButton_Click" Width="75" Height="25" Content="Accessories" Canvas.Left="239" Canvas.Top="3" Style="{DynamicResource GunMiserButtonStyle}"/> 
      <Button Click="AmmunitionButton_Click" Width="75" Height="25" Content="Ammunition" Canvas.Left="160" Canvas.Top="3" Style="{DynamicResource GunMiserButtonStyle}"/> 
     </Canvas> 
    </AdornerDecorator> 
    <controls:PendingChangesConfirmationDialog x:Name="PendingChangesConfirmationDialog" HorizontalAlignment="Stretch" Margin="0,0,0,0" VerticalAlignment="Stretch" Width="1008" Height="730" Visibility="Collapsed" Panel.ZIndex="100" /> 
</Canvas> 

+0

उत्तर के लिए धन्यवाद, मेरे पास कोशिश करने के लिए कोड उपलब्ध नहीं है (मैं ऑफ-साइट काम कर रहा हूं), लेकिन जब मैं इसे वापस प्राप्त करता हूं तो मैं टिप्पणी करूंगा (यह अगस्त तक नहीं हो सकता है :))। – Aligned

+0

धन्यवाद, मेरे पास एक ही समस्या थी और यह समाधान बहुत अच्छा काम करता था। –

+0

धन्यवाद! काश मैं इसे 1,000 बार वोट दे सकता हूं। – danjarvis

0

वैकल्पिक रूप से, तुम सिर्फ तत्व (यह पृष्ठभूमि, अग्रभूमि, आदि) की शैली को बदलना चाहते हैं और नहीं यह पूरी ControlTemplate (जो adorner भी शामिल है) है, तो आप सत्यापन सेट कर सकते हैं। त्रुटि टेम्पलेट ताकि उसके पास कोई सीमा न हो, या विस्मयादिबोधक बिंदु न हो, फिर "Validation.HasError" संपत्ति के आधार पर स्टाइल बदलने के लिए स्टाइल ट्रिगर का उपयोग करें।

<Style TargetType="{x:Type TextBlock}" x:Key="TextBlockErrorStyle"> 
    <Setter Property="Validation.ErrorTemplate"> 
     <Setter.Value> 
      <ControlTemplate> 
       <!-- this gets rid of all adornment INCLUDING THE DEFAULT RED BORDER --> 
       <AdornedElementPlaceholder Name="controlWithError" /> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
    <Style.Triggers> 
     <Trigger Property="Validation.HasError" Value="true"> 
      <Setter Property="Foreground" Value="Red"/> 
      <Setter Property="Background" Value="MistyRose"/> 
      <Setter Property="ToolTip" 
       Value="{Binding RelativeSource={RelativeSource Self}, 
       Path=(Validation.Errors)[0].ErrorContent}"/> 
     </Trigger> 
    </Style.Triggers> 

</Style> 
संबंधित मुद्दे