如何在 UWP 中调整 Canvas 的大小
How to Resize a Canvas in UWP
我有一个扩展 Canvas 的视图。
这样的视图位于另一个 Canvas.
内
public class MyView : Canvas
{
//this is my view
}
protected override void OnNavigatedTo(NavigationEventArgs e)
{
PointerEventManager manager = new PointerEventManager(); // utility to manage the resizing event...
MyView myView = new MyView();
myView.PointerPressed += manager.OnPointerDown;
myView.PointerMoved += manager.OnPointerMoved;
myView.PointerReleased += manager.OnPointerUp;
Canvas parent = new Canvas();
parent.Children.Add(myView);
// other stuff...
}
我希望用户能够调整 myView 的大小。
请注意,这样的视图也应该可以被用户拖动,这是我希望这样的视图成为 Canvas 的主要原因。
方法 manager.OnPointerMoved
的代码如下所示:
protected void OnPointerMoved(object sender, PointerRoutedEventArgs e)
{
myView.Width = myView.Width + 15; // enlarge by 15 pixel the width
myView.Height = myView.Height + 50; // enlarge by 50 pixel the height
}
更改 myView 的宽度和高度无效。
如何正确调整 myView 的大小?
我发现你的代码有几个问题。
首先,你没有设置MyView
的Background
(你没说)。所以,它是空的,因此,它不会捕获任何 PointerEvent
。所以,就是这样。
其次,如果你通过了第一题,但是你没有设置MyView
的Width
和Height
。如果是这样,它们都是 NaN
,这将阻止这两行中的任何一行工作:
myView.Width = myView.Width + 15; // what's NaN + 15 ?
myView.Height = myView.Height + 50; // huh ?
最后,关于
Note that such view should also be draggable by the user, and this is
the main reason I want such view to be a Canvas.
好吧,您可以利用任何 FrameworkElement
的 Margin
属性 来指定它在父级布局中的位置。
您可以简单地使用 Microsoft community toolkit sample 中提供的 GridSplitter
。
我在网格中放置了一个 canvas。 canvas 的大小可以通过网格拆分器修改,是的,canvas 是可拖动的。 Nuget Package
<Page
x:Class="App1.MainPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="using:App1"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d"
xmlns:controls="using:Microsoft.Toolkit.Uwp.UI.Controls"
x:Name="YourPage"
Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
<Grid x:Name="RootGrid"
Margin="48"
BorderThickness="0,0,1,1"
BorderBrush="{ThemeResource SystemControlHighlightChromeHighBrush}"
Height="500"
VerticalAlignment="Top">
<Grid.RowDefinitions >
<RowDefinition Height="*" />
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"></ColumnDefinition>
<ColumnDefinition Width="Auto"></ColumnDefinition>
</Grid.ColumnDefinitions>
<Canvas Background="Red" CanDrag="True" ></Canvas>
<!--Column Grid Splitter-->
<controls:GridSplitter
GripperCursor="Default"
HorizontalAlignment="Right"
Grid.Column="0"
ResizeDirection="Auto"
ResizeBehavior="BasedOnAlignment"
CursorBehavior="ChangeOnSplitterHover"
Width="16">
<controls:GridSplitter.RenderTransform>
<TranslateTransform X="-8" />
</controls:GridSplitter.RenderTransform>
</controls:GridSplitter>
<!--Row Grid Splitter-->
<controls:GridSplitter
Grid.Row="0"
Grid.ColumnSpan="1"
VerticalAlignment="Bottom"
Height="16">
<controls:GridSplitter.RenderTransform>
<TranslateTransform Y="-8" />
</controls:GridSplitter.RenderTransform>
<controls:GridSplitter.Element>
<Grid>
<TextBlock HorizontalAlignment="Center"
IsHitTestVisible="False"
VerticalAlignment="Center"
Text=""
Foreground="White"
FontFamily="Segoe MDL2 Assets">
</TextBlock>
</Grid>
</controls:GridSplitter.Element>
</controls:GridSplitter>
</Grid>
</Page>
为了以后谁会碰到这个问题,我用RelativePanel
而不是Canvas来管理它。
有了它,我可以移动和拖动更改边距 属性,并使用宽度和高度属性调整大小。
我有一个扩展 Canvas 的视图。 这样的视图位于另一个 Canvas.
内public class MyView : Canvas
{
//this is my view
}
protected override void OnNavigatedTo(NavigationEventArgs e)
{
PointerEventManager manager = new PointerEventManager(); // utility to manage the resizing event...
MyView myView = new MyView();
myView.PointerPressed += manager.OnPointerDown;
myView.PointerMoved += manager.OnPointerMoved;
myView.PointerReleased += manager.OnPointerUp;
Canvas parent = new Canvas();
parent.Children.Add(myView);
// other stuff...
}
我希望用户能够调整 myView 的大小。
请注意,这样的视图也应该可以被用户拖动,这是我希望这样的视图成为 Canvas 的主要原因。
方法 manager.OnPointerMoved
的代码如下所示:
protected void OnPointerMoved(object sender, PointerRoutedEventArgs e)
{
myView.Width = myView.Width + 15; // enlarge by 15 pixel the width
myView.Height = myView.Height + 50; // enlarge by 50 pixel the height
}
更改 myView 的宽度和高度无效。
如何正确调整 myView 的大小?
我发现你的代码有几个问题。
首先,你没有设置MyView
的Background
(你没说)。所以,它是空的,因此,它不会捕获任何 PointerEvent
。所以,就是这样。
其次,如果你通过了第一题,但是你没有设置MyView
的Width
和Height
。如果是这样,它们都是 NaN
,这将阻止这两行中的任何一行工作:
myView.Width = myView.Width + 15; // what's NaN + 15 ?
myView.Height = myView.Height + 50; // huh ?
最后,关于
Note that such view should also be draggable by the user, and this is the main reason I want such view to be a Canvas.
好吧,您可以利用任何 FrameworkElement
的 Margin
属性 来指定它在父级布局中的位置。
您可以简单地使用 Microsoft community toolkit sample 中提供的 GridSplitter
。
我在网格中放置了一个 canvas。 canvas 的大小可以通过网格拆分器修改,是的,canvas 是可拖动的。 Nuget Package
<Page
x:Class="App1.MainPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="using:App1"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d"
xmlns:controls="using:Microsoft.Toolkit.Uwp.UI.Controls"
x:Name="YourPage"
Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
<Grid x:Name="RootGrid"
Margin="48"
BorderThickness="0,0,1,1"
BorderBrush="{ThemeResource SystemControlHighlightChromeHighBrush}"
Height="500"
VerticalAlignment="Top">
<Grid.RowDefinitions >
<RowDefinition Height="*" />
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"></ColumnDefinition>
<ColumnDefinition Width="Auto"></ColumnDefinition>
</Grid.ColumnDefinitions>
<Canvas Background="Red" CanDrag="True" ></Canvas>
<!--Column Grid Splitter-->
<controls:GridSplitter
GripperCursor="Default"
HorizontalAlignment="Right"
Grid.Column="0"
ResizeDirection="Auto"
ResizeBehavior="BasedOnAlignment"
CursorBehavior="ChangeOnSplitterHover"
Width="16">
<controls:GridSplitter.RenderTransform>
<TranslateTransform X="-8" />
</controls:GridSplitter.RenderTransform>
</controls:GridSplitter>
<!--Row Grid Splitter-->
<controls:GridSplitter
Grid.Row="0"
Grid.ColumnSpan="1"
VerticalAlignment="Bottom"
Height="16">
<controls:GridSplitter.RenderTransform>
<TranslateTransform Y="-8" />
</controls:GridSplitter.RenderTransform>
<controls:GridSplitter.Element>
<Grid>
<TextBlock HorizontalAlignment="Center"
IsHitTestVisible="False"
VerticalAlignment="Center"
Text=""
Foreground="White"
FontFamily="Segoe MDL2 Assets">
</TextBlock>
</Grid>
</controls:GridSplitter.Element>
</controls:GridSplitter>
</Grid>
</Page>
为了以后谁会碰到这个问题,我用RelativePanel
而不是Canvas来管理它。
有了它,我可以移动和拖动更改边距 属性,并使用宽度和高度属性调整大小。