3 回答

TA貢獻(xiàn)1772條經(jīng)驗 獲得超6個贊
為了在不更改筆觸粗細(xì)的情況下變換形狀,可以使用Path具有變換后幾何形狀的對象。
以下XAML在畫布上放置一個Image和兩個路徑。圖像通過RenderTransform縮放和轉(zhuǎn)換。相同的變換也用于Transform兩個路徑的幾何屬性。
<Canvas>
<Image Source="C:\Users\Public\Pictures\Sample Pictures\Desert.jpg">
<Image.RenderTransform>
<TransformGroup x:Name="transform">
<ScaleTransform ScaleX="0.5" ScaleY="0.5"/>
<TranslateTransform X="100" Y="50"/>
</TransformGroup>
</Image.RenderTransform>
</Image>
<Path Stroke="Orange" StrokeThickness="2">
<Path.Data>
<RectangleGeometry Rect="50,100,100,50"
Transform="{Binding ElementName=transform}"/>
</Path.Data>
</Path>
<Path Stroke="Orange" StrokeThickness="2">
<Path.Data>
<EllipseGeometry Center="250,100" RadiusX="50" RadiusY="50"
Transform="{Binding ElementName=transform}"/>
</Path.Data>
</Path>
</Canvas>
您的應(yīng)用程序現(xiàn)在可以簡單地更改transform對象以響應(yīng)MouseMove或MouseWheel之類的輸入事件。
當(dāng)還要轉(zhuǎn)換TextBlocks或其他不應(yīng)該縮放但只能移動到適當(dāng)位置的元素時,事情會變得有些棘手。
您可以創(chuàng)建一個專門的面板,該面板可以將這種轉(zhuǎn)換應(yīng)用于其子元素。這樣的面板將定義一個控制子元素位置的附加屬性,并將變換應(yīng)用于該位置而不是子元素RenderTransform或LayoutTransform的位置。
這可以使您了解如何實施這樣的小組:
public class TransformPanel : Panel
{
public static readonly DependencyProperty TransformProperty =
DependencyProperty.Register(
"Transform", typeof(Transform), typeof(TransformPanel),
new FrameworkPropertyMetadata(Transform.Identity,
FrameworkPropertyMetadataOptions.AffectsArrange));
public static readonly DependencyProperty PositionProperty =
DependencyProperty.RegisterAttached(
"Position", typeof(Point?), typeof(TransformPanel),
new PropertyMetadata(PositionPropertyChanged));
public Transform Transform
{
get { return (Transform)GetValue(TransformProperty); }
set { SetValue(TransformProperty, value); }
}
public static Point? GetPosition(UIElement element)
{
return (Point?)element.GetValue(PositionProperty);
}
public static void SetPosition(UIElement element, Point? value)
{
element.SetValue(PositionProperty, value);
}
protected override Size MeasureOverride(Size availableSize)
{
var infiniteSize = new Size(double.PositiveInfinity,
double.PositiveInfinity);
foreach (UIElement element in InternalChildren)
{
element.Measure(infiniteSize);
}
return new Size();
}
protected override Size ArrangeOverride(Size finalSize)
{
foreach (UIElement element in InternalChildren)
{
ArrangeElement(element, GetPosition(element));
}
return finalSize;
}
private void ArrangeElement(UIElement element, Point? position)
{
var arrangeRect = new Rect(element.DesiredSize);
if (position.HasValue && Transform != null)
{
arrangeRect.Location = Transform.Transform(position.Value);
}
element.Arrange(arrangeRect);
}
private static void PositionPropertyChanged(
DependencyObject obj, DependencyPropertyChangedEventArgs e)
{
var element = (UIElement)obj;
var panel = VisualTreeHelper.GetParent(element) as TransformPanel;
if (panel != null)
{
panel.ArrangeElement(element, (Point?)e.NewValue);
}
}
}
它將在XAML中像這樣使用:
<local:TransformPanel>
<local:TransformPanel.Transform>
<TransformGroup>
<ScaleTransform ScaleX="0.5" ScaleY="0.5" x:Name="scale"/>
<TranslateTransform X="100"/>
</TransformGroup>
</local:TransformPanel.Transform>
<Image Source="C:\Users\Public\Pictures\Sample Pictures\Desert.jpg"
RenderTransform="{Binding Transform, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=local:TransformPanel}}"/>
<Path Stroke="Orange" StrokeThickness="2">
<Path.Data>
<RectangleGeometry Rect="50,100,100,50"
Transform="{Binding Transform, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=local:TransformPanel}}"/>
</Path.Data>
</Path>
<Path Stroke="Orange" StrokeThickness="2">
<Path.Data>
<EllipseGeometry Center="250,100" RadiusX="50" RadiusY="50"
Transform="{Binding Transform, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=local:TransformPanel}}"/>
</Path.Data>
</Path>
<TextBlock Text="Rectangle" local:TransformPanel.Position="50,150"/>
<TextBlock Text="Ellipse" local:TransformPanel.Position="200,150"/>
</local:TransformPanel>

TA貢獻(xiàn)1828條經(jīng)驗 獲得超3個贊
可以選擇將哪些變換應(yīng)用于哪些元素嗎?有沒有一種方法可以有選擇地應(yīng)用,或者忽略該變換。除了Path
厚度和文本不縮放外,我需要所有圖層都像一幅圖像一樣工作,另外我還需要能夠Path
在圖像上移動,調(diào)整大小,旋轉(zhuǎn)并選擇每個圖層。今天我已經(jīng)完成所有這些工作。是我的滾動查看器和筆觸粗細(xì)。我將嘗試您的自定義Panel
想法,看看是否有什么突出之處并報告。
- 3 回答
- 0 關(guān)注
- 2415 瀏覽
添加回答
舉報