2013-02-20 3 views
1

Я создал модальное окно WPF, который выглядит следующим образом:WPF модальное окно прозрачности

enter image description here

Вот код для окна:

<Window x:Class="Dionysus.Core.Controls.ModalWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Title="ModalWindow" AllowsTransparency="True" Background="Transparent" WindowStyle="None"> 

<Grid Name="MainGrid"> 
    <Rectangle Fill="Gray" Opacity="0.7" /> 
</Grid> 

«ErrorControl »затем добавляется следующим образом:

MainGrid.Children.Add(uc); 

Проблема заключается в том, как только я расширяю трассировки стека, прозрачность управления и изменения:

enter image description here

Я предполагаю, что это что-то делать с ScrollViewer, которая использует неверную прозрачность, то есть из Rectangle вместо содержащего Window.

Я также установить Opacity в UserControl которой принадлежит ScrollViewer к 1, а затем переплетены Opacity:

<ScrollViewer Background="WhiteSmoke" Opacity="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=UserControl}, Path=Opacity}"> 

Может кто-нибудь мне помочь?

-

UPDATE

Вот код UserControl, который вставляется в Window

<Grid x:Name="LayoutRootx" Background="WhiteSmoke"> 
     <StackPanel VerticalAlignment="Stretch"> 
      <TextBlock TextWrapping="Wrap" Margin="5" Text="An error has occured:" Foreground="Black" FontSize="15" FontWeight="Medium"/> 
      <TextBlock TextWrapping="Wrap" Margin="5,10,5,5" Text="{Binding Error}"/> 
      <odc:OdcExpander Header="Stack Trace" Margin="5" IsExpanded="False" Background="WhiteSmoke"> 
       <TextBox Text="{Binding StackTrace}" TextWrapping="Wrap" Margin="5,10,5,5" IsReadOnly="True" MaxHeight="370"/> 
      </odc:OdcExpander> 
      <odc:OdcExpander Header="Comment" Margin="5" IsExpanded="False"> 
       <TextBox Text="{Binding Comment}" TextWrapping="Wrap" Margin="5,10,5,5" MaxHeight="370" Name="txtComment"/> 
      </odc:OdcExpander> 
      <StackPanel Margin="5,10,5,5" Orientation="Horizontal" HorizontalAlignment="Left"> 
       <Button Style="{StaticResource DionysusButton}" Width="100" Height="23" IsDefault="True" Name="btnSendError"> 
        <StackPanel Orientation="Horizontal"> 
         <Image Source="/Dionysus.Shell;component/Images/camera-icon.png" Margin="0,0,5,0"> 

         </Image> 
         <TextBlock Text="Send to IT" VerticalAlignment="Center"/> 
         <core:DionysusTriggerAction Height="0" Width="0" TargetControl="{Binding ElementName=btnSendError}" MethodName="SendError"></core:DionysusTriggerAction> 
        </StackPanel> 
       </Button> 
       <Button Style="{StaticResource DionysusButton}" Width="100" Height="23" Name="btnExit" Margin="10,0,0,0" IsCancel="True"> 
        <StackPanel Orientation="Horizontal"> 
         <Image Source="/Dionysus.Shell;component/Images/DeleteRed.png" Margin="0,0,5,0"> 

         </Image> 
         <TextBlock Text="Close" VerticalAlignment="Center"/> 
        </StackPanel> 
       </Button> 
       <core:DionysusTriggerAction Height="0" Name="triggerAction2" Width="0" TargetControl="{Binding ElementName=btnExit}" MethodName="Exit"></core:DionysusTriggerAction> 
      </StackPanel> 
     </StackPanel> 
    </Grid> 

ответ

0

Если окно имеет фиксированный размер и не может быть изменен, вы можете использовать следующий трюк:

<Grid> 
    <Border BorderThickness="100" BorderBrush="Gray" Opacity="0.7"> 
     <Grid Background="White" Grid.Column="1" Grid.Row="1" x:Name="contentPlaceHolder"> 
      <TextBlock Text="HELLO WORLD" HorizontalAlignment="Center" VerticalAlignment="Center"/> 
     </Grid> 
    </Border> 
</Grid> 

H owever, то маловероятно, что ваше Окно всегда будет иметь тот же размер, так, чтобы сделать его более динамичным, вы можете изменить расположение окна следующим образом:

<Grid> 
    <Grid.ColumnDefinitions> 
     <ColumnDefinition/> 
     <ColumnDefinition Width="YourDesiredSize"/> 
     <ColumnDefinition/> 
    </Grid.ColumnDefinitions> 
    <Grid.RowDefinitions> 
     <RowDefinition/> 
     <RowDefinition Height="YourDesiredSize"/> 
     <RowDefinition/> 
    </Grid.RowDefinitions> 
    <Rectangle Fill="Gray" Opacity="0.7" Grid.Row="0" Grid.ColumnSpan="3"/> 
    <Rectangle Fill="Gray" Opacity="0.7" Grid.Row="2" Grid.ColumnSpan="3"/> 
    <Rectangle Fill="Gray" Opacity="0.7" Grid.Row="1" Grid.Column="0"/> 
    <Rectangle Fill="Gray" Opacity="0.7" Grid.Row="1" Grid.Column="2"/> 

    <Grid Grid.Column="1" Grid.Row="1" Background="White" x:Name="contentPlaceHolder"> 
     <TextBlock Text="HELLO WORLD" HorizontalAlignment="Center" VerticalAlignment="Center"/> 
    </Grid> 
</Grid> 

В результате этого окна помещается поверх другого выглядит более или менее, как это:

transparent scrollviewer

, а затем вместо добавления к MainGrid, добавить UserControl в contentPlaceHolder или же вы хотите назвать это:

contentPlaceHolder.Children.Add(uc); 
+0

Привет, я изменил свой код соответственно, и проблема все еще остается в том, что мой фактический 'UserControl' по-прежнему прозрачен! –

+0

Попробуйте вставить 'ScrollViewer' в свой' contentPlaceHolder', если я не ошибаюсь, он должен сделать то же самое! –

+0

Я попробовал, и он все еще не прозрачен. Я обновил скриншот. Есть ли что-нибудь еще в вашем коде (я думаю «ElementBinding» или «DataTemplates»), что может привести к изменению фона, как только откроется «Expander»? – RoelF

0

Хорошо, поэтому я нашел решение, которое работает для меня, я уверен, что это не самое лучшее, но это может помочь кому-то с той же проблемой, что и я.

Проблема заключалась в том, что элементы управления в моем UserControl, которые я добавил к моему Window, были прозрачными, хотя я не мог понять причину, я нашел простую обходную проблему.

Изменяя OpacityMask свойство UserControl в любой требуемый Background цвет, даже если изменения управления непрозрачности, это будет замаскирован с Brush, которые вы применяете.

uc.OpacityMask = Brushes.WhiteSmoke; 

Надеюсь, это поможет кому-то!

Смежные вопросы