2009-09-25 79 views
10

alt text http://img42.imageshack.us/img42/4161/blinkthru.pngWPF - 如何將用戶控件放置在AdornedElementPlaceholder上?

我試圖得到驗證不通過我的自定義模式對話框顯示。我試過設置對話框的zindex和這個模板中的元素。有任何想法嗎?

這是從驗證模板來:

<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 2009-10-08 14:47:50

回答

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 2010-04-08 14:02:04

+0

謝謝,我有同樣的問題,這個解決方案效果很好。 – 2011-07-29 15:01:10

+0

謝謝!我希望我能夠投票這1000次。 – danjarvis 2011-09-13 18:36:29

0

另外,如果你想改變的元素(它的背景,前景等)僅僅是風格,而不是它的整個控件模板(包括裝飾器),你可以設置驗證。 ErrorTemplate因此,它並沒有邊框,或感嘆號,然後使用樣式觸發改變基於屬性「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> 
相關問題