На WPF-форме лежат кнопка и под ней WebBrowser. Необходимо, чтобы после щелчка по кнопке у WebBrowser-а верхняя граница плавно съезжала бы вниз на определённое кол-во пикселей. Я сделал так, что в обработчике щелчка по кнопке запускается её анимированное увеличение. Но этот вариант не работает, т. е. кнопка масштабируется, но верхняя граница WebBrowser-а остаётся на месте. Почему?
XAML
<Window x:Class="WpfApplication2.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525">
<Window.Resources>
<Storyboard x:Key="ScaleBrowserUpToDown" TargetName="BrowserUpDownMover">
<DoubleAnimation Storyboard.TargetProperty="RenderTransform.(ScaleTransform.ScaleY)"
Duration="0:0:0.6" From="1" To="4" />
</Storyboard>
<Storyboard x:Key="ScaleBrowserDownToUp" TargetName="BrowserUpDownMover">
<DoubleAnimation Storyboard.TargetProperty="RenderTransform.(ScaleTransform.ScaleY)"
Duration="0:0:0.6" From="4" To="1"/>
</Storyboard>
</Window.Resources>
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="1*" />
</Grid.RowDefinitions>
<Button Grid.Row="0" Name="BrowserUpDownMover" Height="20" Click="BrowserUpDownMover_Click">
<Button.RenderTransform>
<ScaleTransform ScaleX="1" ScaleY="1"/>
</Button.RenderTransform>
</Button>
<WebBrowser Grid.Row="1" Name="ContentViewBrowser" Source="C:\Temp\Error.html">
<WebBrowser.RenderTransform>
<ScaleTransform ScaleX="1" ScaleY="1"/>
</WebBrowser.RenderTransform>
</WebBrowser>
</Grid>
</Window>
C#
using System;
using System.Windows;
using System.Windows.Media;
using System.Windows.Media.Animation;
namespace WpfApplication2
{
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
private void BrowserUpDownMover_Click(object sender, RoutedEventArgs e)
{
ScaleTransform trans = BrowserUpDownMover.RenderTransform as ScaleTransform;
if (trans != null && trans.ScaleY > 1)
BrowserUpDownMover.BeginStoryboard((Storyboard)this.Resources["ScaleBrowserDownToUp"]);
else
BrowserUpDownMover.BeginStoryboard((Storyboard)this.Resources["ScaleBrowserUpToDown"]);
}
}
}
Здравствуйте, MxMsk, Вы писали:
MM>Не ту трансформацию используешь. RenderTransform не учитывается при определении размеров элементов и их компоновке. Оно отвечает за преобразование того, что уже отрендерено. В твоем же случае надо использовать LayoutTransform.
Спасибо. Нашёл другое решение задачи:
<Window x:Class="WpfApplication2.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525">
<Window.Resources>
<Storyboard x:Key="ScaleBrowserUpToDown" TargetName="BrowserUpDownMover">
<DoubleAnimation Storyboard.TargetProperty="Height"
Duration="0:0:0.6" From="20" To="40" />
</Storyboard>
<Storyboard x:Key="ScaleBrowserDownToUp" TargetName="BrowserUpDownMover">
<DoubleAnimation Storyboard.TargetProperty="Height"
Duration="0:0:0.6" From="40" To="20"/>
</Storyboard>
</Window.Resources>
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="1*" />
</Grid.RowDefinitions>
<Button Grid.Row="0" Name="BrowserUpDownMover" Height="20" Click="BrowserUpDownMover_Click">
</Button>
<WebBrowser Grid.Row="1" Name="ContentViewBrowser" Source="C:\Temp\Error.html">
</WebBrowser>
</Grid>
</Window>
using System;
using System.Windows;
using System.Windows.Media;
using System.Windows.Media.Animation;
namespace WpfApplication2
{
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
private void BrowserUpDownMover_Click(object sender, RoutedEventArgs e)
{
if (BrowserUpDownMover.Height > 20)
BrowserUpDownMover.BeginStoryboard((Storyboard)this.Resources["ScaleBrowserDownToUp"]);
else
BrowserUpDownMover.BeginStoryboard((Storyboard)this.Resources["ScaleBrowserUpToDown"]);
}
}
}