Эффект Spotlight в wpf
Есть ли способ добиться эффекта прожектора в wpf? http://www.youtube.com/watch?v=LgLw29c-qr8
Я понимаю, что OpacityMask позволит мне это сделать, но как я могу отобразить изображение (или фон) на холсте, но будет отображаться белым цветом во всех регионах, кроме области, где отображается кнопка?
Вот несколько изображений, чтобы лучше объяснить мою проблему,
frame1 показывает кнопку у левого края экрана, маскирующую часть фона холста.
frame2 показывает кнопку в середине экрана, маскирующую другую часть фона холста.
фактический фон холста, который замаскирован
1 ответ
Я пришел к следующему решению,
<Window x:Class="Masking.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
x:Name="ParentWindow"
WindowStyle="SingleBorderWindow"
Title="MainWindow" Width="800" Height="600">
<StackPanel>
<StackPanel Orientation="Horizontal" HorizontalAlignment="Center">
<Slider Value="{Binding ElementName=VisualButton, Path=(Canvas.Left)}" Minimum="0" Maximum="800" Width="800" Canvas.Left="0" Canvas.Top="10" TickFrequency="100" LargeChange="10" />
<TextBlock Text="{Binding ElementName=VisualButton, Path=(Canvas.Left)}" />
</StackPanel>
<StackPanel Orientation="Horizontal" HorizontalAlignment="Center">
<Slider Value="{Binding ElementName=VisualButton, Path=(Canvas.Top)}" Minimum="0" Maximum="800" Width="800" Canvas.Left="0" Canvas.Top="10" TickFrequency="100" LargeChange="10" />
<TextBlock Text="{Binding ElementName=VisualButton, Path=(Canvas.Top)}" />
</StackPanel>
<Canvas Width="800" Height="600">
<Canvas.OpacityMask>
<VisualBrush Stretch="None" Viewbox="0,0,800,600" ViewboxUnits="Absolute" Viewport="0,0,800,600" ViewportUnits="Absolute">
<VisualBrush.Visual>
<Canvas Width="800" Height="600">
<Button x:Name="VisualButton" Width="100" Height="100" Canvas.Left="0" Canvas.Top="0" />
</Canvas>
</VisualBrush.Visual>
</VisualBrush>
</Canvas.OpacityMask>
<Canvas.Background>
<ImageBrush ImageSource="Desert.jpg" />
</Canvas.Background>
</Canvas>
</StackPanel>
но я не чувствую, что это правильный подход. Пожалуйста, дайте мне знать лучший подход, если это возможно.