2009-09-25 25 views
10

alt text http://img42.imageshack.us/img42/4161/blinkthru.pngWPF - Come posso inserire un usercontrol su un AdornedElementPlaceholder?

Sto cercando di ottenere che la convalida non venga visualizzata tramite la mia finestra di dialogo personalizzata. Ho provato a impostare zindex della finestra di dialogo e degli elementi in questo modello. Qualche idea?

questo sta venendo da un modello di convalida:

<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> 

la finestra:

<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> 

E la finestra generale è:

<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- a - La risposta di Donnelle ha aiutato un expander con cui avevo problemi. – Aligned

risposta

13

È problema è che il modello di errore è mostrato nel livello di adorner che nel tuo caso sarà nella finestra radice.

Se dovessi cambiare il tuo codice di seguito non avresti alcun problema, perché ci sarebbe un layer di adorner separato creato attorno al resto dei tuoi controlli.

<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

Grazie per la risposta, non ho il codice disponibile per provare (sto lavorando fuori sede), ma commenterò quando tornerò (potrebbe non essere fino a agosto :)). – Aligned

+0

Grazie, ho avuto lo stesso problema e questa soluzione ha funzionato benissimo. –

+0

Grazie! Vorrei poter votare questo 1000 volte. – danjarvis

0

In alternativa, se si desidera cambiare solo lo stile dell'elemento (il suo sfondo, in primo piano, ecc) e non si tratta di tutta la ControlTemplate (che include l'adorner), è possibile impostare la convalida. ErrorTemplate in modo che non abbia un bordo o punto esclamativo, quindi usa un trigger di stile per modificare lo stile in base alla proprietà "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> 
Problemi correlati