Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# UWP:在写入/绘制时调整InkCanvas大小_C#_Xaml_Uwp - Fatal编程技术网

C# UWP:在写入/绘制时调整InkCanvas大小

C# UWP:在写入/绘制时调整InkCanvas大小,c#,xaml,uwp,C#,Xaml,Uwp,我正在学习如何开发UWP应用程序,并将Microsoft的文档用作教程/研究 我希望有一个类似于OneNote的InkCanvas设计,其中InkCanvas的高度和宽度可以扩展(当您书写/绘制并达到窗口大小的末尾时),也可以缩小(当您擦除墨迹笔划时,额外的大小可以根据墨迹笔划的位置减小,直到恢复到原始大小) 我可以增加墨水画布的宽度和高度,但在擦除墨水笔划时不能减少 以下是MainPage.xaml代码: <Grid> <Grid.ColumnDefinitions&

我正在学习如何开发UWP应用程序,并将Microsoft的文档用作教程/研究

我希望有一个类似于OneNote的InkCanvas设计,其中InkCanvas的高度和宽度可以扩展(当您书写/绘制并达到窗口大小的末尾时),也可以缩小(当您擦除墨迹笔划时,额外的大小可以根据墨迹笔划的位置减小,直到恢复到原始大小)

我可以增加墨水画布的宽度和高度,但在擦除墨水笔划时不能减少

以下是MainPage.xaml代码:

<Grid>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="*" />
        <ColumnDefinition Width="*" />
    </Grid.ColumnDefinitions>

    <Grid.RowDefinitions>
        <RowDefinition Height="Auto" />
        <RowDefinition Height="*" />
    </Grid.RowDefinitions>

    <TextBlock Text="Heading"
                   FontSize="36"
                   FontWeight="Bold"
                   Margin="10"
                   Grid.Column="0"
                   Grid.Row="0"/>

    <Grid BorderBrush="Red"
                    BorderThickness="2"
                    Margin="10"
                    Grid.Column="0"
                    Grid.Row="1">
        <ScrollViewer HorizontalScrollBarVisibility="Auto"
                      HorizontalScrollMode="Enabled"
                      VerticalScrollBarVisibility="Auto"
                      VerticalScrollMode="Enabled" >

            <Grid BorderBrush="Blue"
                    BorderThickness="2"
                    Margin="1">
                <InkCanvas Name="inkCanvas"/>
            </Grid>
        </ScrollViewer>

    </Grid>
c#代码也来自另一个stackoverflow解决方案,但无法计算出“减少”部分


任何帮助都将不胜感激。谢谢

如果您希望在擦除墨水笔划时
InkCanvas
控件缩小,并且额外大小可以根据墨水笔划的位置减小,直到达到原始大小,则需要添加
InkPresenter.StrokesErased
事件来管理
InkCanvas
控件的大小。例如:

下面是
MainPage.xaml
代码(为了便于测试,我添加了鼠标支持):


非常感谢你!在看到您的解决方案并在减小
InkCanvas
大小方面取得一些进展之前,我实际上正在查找如何使用
InkPresenter.StrokesErased
到代码中,但仍然无法正常工作。一旦我看到您的解决方案并将其添加到我的代码中,它就工作得非常完美!我感谢你的帮助。
public MainPage()
    {
        this.InitializeComponent();
        nkCanvas.InkPresenter.StrokeInput.StrokeEnded += adjustInkCanvasSize;
    }

    private  async void adjustInkCanvasSize(InkStrokeInput sender, PointerEventArgs args)
    {
        await Task.Delay(100);

        var XBound = inkCanvas.InkPresenter.StrokeContainer.BoundingRect.Bottom;
        if (XBound > inkCanvas.ActualHeight - 200)
            inkCanvas.Height = XBound + 200;

        var YBound = inkCanvas.InkPresenter.StrokeContainer.BoundingRect.Right;
        if (YBound > inkCanvas.ActualWidth - 200)
            inkCanvas.Width = YBound + 200;
     }
<Grid>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="*" />
        <ColumnDefinition Width="*" />
    </Grid.ColumnDefinitions>

    <Grid.RowDefinitions>
        <RowDefinition Height="Auto" />
        <RowDefinition Height="*" />
    </Grid.RowDefinitions>

    <TextBlock Text="Heading"
               FontSize="36"
               FontWeight="Bold"
               Margin="10"
               Grid.Column="0"
               Grid.Row="0"/>

    <Grid BorderBrush="Red"
                BorderThickness="2"
                Margin="10"
                Grid.Column="0"
                Grid.Row="1">
        <Grid.RowDefinitions>
            <RowDefinition Height="auto"/>
            <RowDefinition Height="*"/>
        </Grid.RowDefinitions>

        <InkToolbar x:Name="inkToolbar" VerticalAlignment="Top" Margin="10,0,10,0"
                            TargetInkCanvas="{x:Bind inkCanvas}" Grid.Row="0"/>
        <ScrollViewer HorizontalScrollBarVisibility="Auto"
                  HorizontalScrollMode="Enabled" Grid.Row="1"
                  VerticalScrollBarVisibility="Auto"
                  VerticalScrollMode="Enabled" >

            <Grid BorderBrush="Blue"
                BorderThickness="2"
                Margin="1">
                
                <InkCanvas Name="inkCanvas" />
                
            </Grid>
        </ScrollViewer>

    </Grid>
</Grid>
public sealed partial class MainPage : Page
{
    private double originalX; //The original size
    private double originalY;
    private double maxX=0.0; 
    private double maxY=0.0;
    private bool flag = true;
    public MainPage()
    {
        this.InitializeComponent();

        inkCanvas.InkPresenter.InputDeviceTypes = CoreInputDeviceTypes.Mouse | CoreInputDeviceTypes.Touch |
            CoreInputDeviceTypes.Pen;
        inkCanvas.InkPresenter.StrokeInput.StrokeEnded += adjustInkCanvasSize;
        inkCanvas.InkPresenter.StrokesErased += InkPresenter_StrokesErased;
    }

    private async void InkPresenter_StrokesErased(InkPresenter sender, InkStrokesErasedEventArgs args)
    {
        await Task.Delay(100);

        //The coordinate of the lower right corner of the erased ink stoke
        var erasedInkX= args.Strokes.ElementAt(0).BoundingRect.Bottom;
        var erasedInkY = args.Strokes.ElementAt(0).BoundingRect.Right;
        
        var XBound = inkCanvas.InkPresenter.StrokeContainer.BoundingRect.Bottom;
        if (erasedInkX >=maxX&&XBound < inkCanvas.ActualHeight + 100)
        {
            if (XBound - 100 > originalX)
                inkCanvas.Height = XBound - 100;
            else
                inkCanvas.Height = originalX;  //The size of InkCanvas shrinks to the original size.

            maxX = inkCanvas.Height;
        }
            
        var YBound = inkCanvas.InkPresenter.StrokeContainer.BoundingRect.Right;
        if (erasedInkY>=maxY&&YBound < inkCanvas.ActualWidth + 100)
        {
            if (YBound - 100 > originalY)
            {
                inkCanvas.Width = YBound - 100;
            }
            else
                inkCanvas.Width = originalY;

            maxY = inkCanvas.Width;
        }
    }

    private async void adjustInkCanvasSize(InkStrokeInput sender, PointerEventArgs args)
    {
        await Task.Delay(100);

        if(flag)
        {
            flag = false;
            originalX = inkCanvas.ActualHeight;  //Get the original size 
            originalY = inkCanvas.ActualWidth;
        }
        var XBound = inkCanvas.InkPresenter.StrokeContainer.BoundingRect.Bottom;
        if (XBound > maxX)
            maxX = XBound;  //maxX and maxY always hold the maximum size of StrokeContainer

        if (XBound > inkCanvas.ActualHeight - 200)
            inkCanvas.Height = XBound + 200;

        var YBound = inkCanvas.InkPresenter.StrokeContainer.BoundingRect.Right;
        if (YBound > maxY)
            maxY = YBound;

        if (YBound > inkCanvas.ActualWidth - 200)
            inkCanvas.Width = YBound + 200;
    }
}