在我的应用程序中,用户可以选择一个Image并将其拖到a上Grid,以便进行播放.我通过处理PointerEntered事件来做到这一点Grid.在这里,我检测用户是否选择了图像以及用户是否按住鼠标按钮.
现在,我要放置Image在网格上,并通过对(仍然按下)指向我的Image,所以Image使用它自己的ManipulationStarted,ManipulationDelta和ManipulationCompleted事件.这应该让用户将图像从图像列表中平滑移动到Grid,而不必释放并单击元素.
我已经尝试从senderin中释放指针PointerEntered并使用它捕获它CapturePointer,但这似乎不起作用,即使CapturePointer返回true.
这是我用于PointerEntered事件的代码:
private void DrawingArea_OnPointerEntered(object sender, PointerRoutedEventArgs e)
{
// If we enter the grid while dragging and we have an image that was dragged
if (e.Pointer.IsInContact && CurrentDraggedImage != null)
{
DrawingArea.Children.Add(CurrentDraggedImage);
// Move it to the location we're currently at
var transform …Run Code Online (Sandbox Code Playgroud) 我试图找出为什么下面的代码似乎不起作用.它没有给出错误 - 它根本不会缩放.如果我将其更改为我的第二个代码示例,它实际上似乎有效.有人有任何想法吗?
谢谢
public static void StartMouseEnterAnimation(Button button)
{
Storyboard storyboard = new Storyboard();
ScaleTransform scale = new ScaleTransform(1.0, 1.0, 1, 1);
button.RenderTransformOrigin = new Point(0.5, 0.5);
button.RenderTransform = scale;
DoubleAnimation growAnimation = new DoubleAnimation();
growAnimation.Duration = TimeSpan.FromMilliseconds(300);
growAnimation.From = 1;
growAnimation.To = 1.8;
storyboard.Children.Add(growAnimation);
Storyboard.SetTargetProperty(growAnimation, new PropertyPath(ScaleTransform.ScaleXProperty));
Storyboard.SetTarget(growAnimation, scale);
storyboard.Begin();
}
Run Code Online (Sandbox Code Playgroud)
---下面的DOES工作,但我必须创建一个TransformGroup并通过一个更复杂的PropertyChain引用它...
public static void StartMouseEnterAnimation(Button button)
{
Storyboard storyboard = new Storyboard();
ScaleTransform scale = new ScaleTransform(1.0, 1.0, 1, 1);
button.RenderTransformOrigin = new Point(0.5, 0.5);
TransformGroup myTransGroup …Run Code Online (Sandbox Code Playgroud) 我已经处理过LayoutTransform和RenderTransform,我知道每个都适合我在以前的项目中找到的特定场景.
但是,从性能角度和使用WPF分析工具时,对于一个实例,哪一个对UI性能的影响较小?
当我使用RenderTransform属性并向上扩展RichTextBox时,我获得了像素化的放大文本(方形文本边缘).
我怎么能阻止这个?

编辑:
我有TextOptions.TextFormattingMode ="显示" - 当我删除此选项时一切都很好!
这是我的ItemsControl的代码,当鼠标移过时放大项目.
我没有设法增加当前缩放项目的ZIndex以将其放在其他项目上.
<ItemsControl ItemsSource="{Binding Path=Value}">
<ItemsControl.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding Path=Name}"
RenderTransformOrigin="0.5 0.5">
<TextBlock.Style>
<Style TargetType="{x:Type TextBlock}">
<Style.Triggers>
<Trigger Property="IsMouseOver" Value="True">
<Setter Property="RenderTransform">
<Setter.Value>
<ScaleTransform ScaleX="1.5"
ScaleY="1.5" />
</Setter.Value>
</Setter>
</Trigger>
</Style.Triggers>
</Style>
</TextBlock.Style>
</TextBlock>
</DataTemplate>
</ItemsControl.ItemTemplate>
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<WrapPanel Orientation="Horizontal" />
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
Run Code Online (Sandbox Code Playgroud)
我试图在触发器中直接更改ZIndex,但它不起作用.
我似乎需要更改ContentPresenter中的ZIndex,它是VisualTree中TextBlock的Parent,而不是直接在TextBlock中.
<Setter Property="Panel.ZIndex" Value="99" />
Run Code Online (Sandbox Code Playgroud)
所以我尝试在ContentPresenter中更改ZIndex,但它仍然不起作用
<ItemsControl.ItemContainerStyle>
<Style TargetType="{x:Type ContentPresenter}">
<Style.Triggers>
<Trigger Property="IsMouseOver" Value="True">
<Setter Property="Panel.ZIndex" Value="99" />
</Trigger>
</Style.Triggers>
</Style>
</ItemsControl.ItemContainerStyle>
Run Code Online (Sandbox Code Playgroud)
有谁知道它是如何工作的?
假设我有这个XAML代码:
<DockPanel Name="pan">
<Label Content="AAA" Name="lab1" />
<Label Content="BBB" Name="lab2" />
<Label Content="CCC" Name="lab3" />
</DockPanel>
Run Code Online (Sandbox Code Playgroud)
我在我后面的代码我想找出是什么的坐标lab2范围内pan.Hovewer我想忽略任何现有的RenderTransform lab2.因此,解决方案必须返回上述代码的相同坐标,并遵循:
<DockPanel>
<Label Content="AAA" />
<Label Content="BBB" >
<Label.RenderTransform>
<TranslateTransform Y="20"/>
</Label.RenderTransform>
</Label>
<Label Content="CCC" />
</DockPanel>
Run Code Online (Sandbox Code Playgroud)
换句话说我想这是在设定的位置ArrangeOverride的方法pan调用时Arrange上but2.我称之为"合乎逻辑的位置".通过调用以下方法可以获得"视觉位置":
private Point visualPoss() {
Point lab2Vis = lab2.PointToScreen(new Point(0, 0));
Point panVis = pan.PointToScreen(new Point(0, 0));
return new Point(lab2Vis.X - panVis.X, lab2Vis.Y - panVis.Y);
}
Run Code Online (Sandbox Code Playgroud)
但这不是我的问题的解决方案,因为visualPoss()对于上面的两个XAML代码示例,它的返回值不相等.
如果不清楚,请留下评论.
谢谢
我有一个像这样应用RenderTransform的画布:
<Canvas RenderTransform="0.1,0,0,-0.1,0,913">
Run Code Online (Sandbox Code Playgroud)
谁能告诉我这些价值观是什么意思?我似乎无法找到用于解析这些值的转换器.
我有这个代码:
RotateTransform transform = myImage.RenderTransform as RotateTransform;
transform.Angle = 25.0;
myImage.RenderTransform = transform;
Run Code Online (Sandbox Code Playgroud)
它设置了Angle我的Image元素。它有效,但它并没有像我预期的那样移动太多。
我只是想知道是否Angle是根据图像的右上角设置的?那么,它是否将图像从图像右侧旋转 25 度?
基本上,我有一个FooControl(我并没有设置高度/宽度明确)加入Grid。
<Grid>
<Grid.RowDefinitions>
<RowDefinition />
<RowDefinition />
</Grid.RowDefinitions>
<FooControl x:Name="HWFoo" Content="HelloWorld" Grid.Row="0">
<FooControl.RenderTransform>
<TransformGroup>
<RotateTransform Angle="270" />
<TranslateTransform Y="{Binding ActualWidth, ElementName=HWFoo}" />
</TransformGroup>
</FooControl.RenderTransform>
</FooControl>
</Grid>
Run Code Online (Sandbox Code Playgroud)
但是,现在的问题是 FooControl 填满了整行,当它被转换时,它看起来很奇怪(因为它的高度/宽度)。
我正在创建一个包含单个图像的对话框,并覆盖多边形.问题是图像的比例与多边形的比例不同,所以我想缩小图像以匹配多边形的比例.但是当我使用RenderTransform/ScaleTransform标签时,图像的大小会缩小,在对话框的右下角留下空白.是的,叠加现在可以正常工作,但我想让它填满可用空间来填充窗口.
<Window x:Class="vw.CollImage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Collection Image" Height="700" Width="700"
WindowStartupLocation="CenterOwner" Grid.IsSharedSizeScope="False"
Icon="Resources\ty.ico">
<Viewbox MinWidth="70" MinHeight="70">
<Grid>
<Image Name="imgColl" HorizontalAlignment="Left" VerticalAlignment="Top" Source="{Binding ImageData}">
<Image.RenderTransform>
<ScaleTransform ScaleX="0.75" ScaleY="0.75"/>
</Image.RenderTransform>
</Image>
<Polyline Stroke="OrangeRed" StrokeThickness="6" Points="{Binding Coordinates}"/>
</Grid>
</Viewbox>
</Window>
Run Code Online (Sandbox Code Playgroud) 我有一个Image如下所示。使用MatrixTransformI 可以轻松放大和缩小。如何检测缩放是否太小/太大?例如,我想将缩放限制为 10-200%。
<ScrollViewer x:Name="scrollViewer" ScrollViewer.HorizontalScrollBarVisibility="Auto" ScrollViewer.VerticalScrollBarVisibility="Auto">
<Border x:Name="border" ClipToBounds="True" Width="Auto" Height="Auto">
<Image x:Name="image" Source="test.png"/>
</Border>
</ScrollViewer>
Run Code Online (Sandbox Code Playgroud)
实际改造:
Point p = e.MouseDevice.GetPosition(image);
Matrix m = image.RenderTransform.Value;
if (e.Delta > 0)
m.ScaleAtPrepend(1.1, 1.1, p.X, p.Y);
else
m.ScaleAtPrepend(1.0 / 1.1, 1.0 / 1.1, p.X, p.Y);
// How do I know if the zoom level is lower than 10% or higher than 200%?
image.RenderTransform = new MatrixTransform(m);
Run Code Online (Sandbox Code Playgroud) rendertransform ×11
wpf ×10
c# ×3
xaml ×2
.net ×1
animation ×1
controls ×1
converter ×1
graphics ×1
itemscontrol ×1
panel ×1
performance ×1
richtextbox ×1
viewbox ×1
z-index ×1
zooming ×1