Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/314.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/solr/3.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# ItemsControl中有多个InkCanvas实例->;在其他实例上按鼠标键会导致长线_C#_Wpf_Itemscontrol_Inkcanvas - Fatal编程技术网

C# ItemsControl中有多个InkCanvas实例->;在其他实例上按鼠标键会导致长线

C# ItemsControl中有多个InkCanvas实例->;在其他实例上按鼠标键会导致长线,c#,wpf,itemscontrol,inkcanvas,C#,Wpf,Itemscontrol,Inkcanvas,在ItemsControl中使用多个InkCanvas实例时出现问题。每个InkCanvas实例接收一个ImageBrush作为背景,然后添加到ItemsControl。基本上,这是一个自行编写的PdfViewer,用户可以在pdf页面上绘制备注等,然后再次将文件保存为pdf。读取原始pdf,将页面转换为位图,并将每个位图用作InkCanvas的背景 只要我不点击另一个画布,这就可以很好地工作。以下是两张图片来说明问题: PdfViewer的XAML: <UserControl x:C

在ItemsControl中使用多个InkCanvas实例时出现问题。每个InkCanvas实例接收一个ImageBrush作为背景,然后添加到ItemsControl。基本上,这是一个自行编写的PdfViewer,用户可以在pdf页面上绘制备注等,然后再次将文件保存为pdf。读取原始pdf,将页面转换为位图,并将每个位图用作InkCanvas的背景

只要我不点击另一个画布,这就可以很好地工作。以下是两张图片来说明问题:

PdfViewer的XAML:

<UserControl x:Class="PdfTool.Code.Controls.PdfViewer"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
             xmlns:viewModel="clr-namespace:PdfTool.Code.ViewModel"
             mc:Ignorable="d" 
             d:DataContext="{d:DesignInstance {x:Type viewModel:CanvasViewModel}, IsDesignTimeCreatable=False}"
             d:DesignHeight="450" d:DesignWidth="800">
    <ScrollViewer PanningMode="Both" Background="{StaticResource MainBackgroundColor}">
        <ItemsControl x:Name="PagesContainer" MouseWheel="PagesContainer_OnMouseWheel">
            <ItemsControl.RenderTransform>
                <MatrixTransform/>
            </ItemsControl.RenderTransform>
        </ItemsControl>
    </ScrollViewer>
</UserControl>
只有MouseWheel事件用于缩放,它不是问题的原因。看起来,InkCanvas 1上的鼠标坐标用作InkCanvas 2的初始值。我怎样才能改变这种行为?

我明白了:让我走上了正确的方向。我只需要设置

Focusable="False"
在InkCanvas上,我的问题得到了解决,因为如果要进入视图的对象不可聚焦,滚动条的RequestBringIntoView事件不会被触发…

我明白了:让我走对了方向。我只需要设置

Focusable="False"

在InkCanvas上,我的问题得到了解决,因为如果要进入视图的对象不可聚焦,则不会触发滚动条的RequestBringIntoView事件…

如果不知道实现细节,这很困难。你为什么认为上一页的Cooridate用于下一页?如果用户可以在页面之间画线,则不会增加价值。为什么不将页面作为单独的对象进行隔离?每个页面对象都有自己的上下文数据,如鼠标单击坐标和绘制的对象或注释。每个页面都会使用相对坐标分别处理鼠标事件。就像在第一幅图像中一样:单击下一页的顶部实际上就是单击视图端口的底部。您必须将此底部视图端口坐标(例如Y=800)转换为下一页的顶部坐标(例如Y=50)。尝试使用
鼠标.GetPosition(pageCanvas)
获取相对于所选页面画布而不是视口的坐标。另外,当指针离开上下文或页面画布时,请取消上一页的鼠标操作。您好,感谢您的回答:-)要回答您的第一条评论:我的页面作为单个对象被隔离,请参阅行->pdfViewer.PagesContainer.Items.Add(新的PdfDetailElement(新的ImageBrush(位图){Stretch=Stretch.Uniform});每个画布都是一个单独的元素,也单独处理MouseEvents,但目前我还没有实现任何。为了回答第二个问题:出于测试目的,我在InkCanves控件上实现了PreviewMouseDown事件,它返回正确的鼠标坐标,但没有在正确的位置绘制笔划。好的,它从正确的地方开始,然后像上面原始问题所描述的那样往下跳。这会导致在点之间画一条线——正确的起点和它跳到的点。Scrollviewer似乎会自动向下滚动,通过开始画一条线来居中设置焦点的元素?不知道实现细节是很困难的。你为什么认为上一页的Cooridate用于下一页?如果用户可以在页面之间画线,则不会增加价值。为什么不将页面作为单独的对象进行隔离?每个页面对象都有自己的上下文数据,如鼠标单击坐标和绘制的对象或注释。每个页面都会使用相对坐标分别处理鼠标事件。就像在第一幅图像中一样:单击下一页的顶部实际上就是单击视图端口的底部。您必须将此底部视图端口坐标(例如Y=800)转换为下一页的顶部坐标(例如Y=50)。尝试使用
鼠标.GetPosition(pageCanvas)
获取相对于所选页面画布而不是视口的坐标。另外,当指针离开上下文或页面画布时,请取消上一页的鼠标操作。您好,感谢您的回答:-)要回答您的第一条评论:我的页面作为单个对象被隔离,请参阅行->pdfViewer.PagesContainer.Items.Add(新的PdfDetailElement(新的ImageBrush(位图){Stretch=Stretch.Uniform});每个画布都是一个单独的元素,也单独处理MouseEvents,但目前我还没有实现任何。为了回答第二个问题:出于测试目的,我在InkCanves控件上实现了PreviewMouseDown事件,它返回正确的鼠标坐标,但没有在正确的位置绘制笔划。好的,它从正确的地方开始,然后像上面原始问题所描述的那样往下跳。这会导致在点之间画一条线——正确的起点和它跳到的点。Scrollviewer似乎会自动向下滚动,通过开始画一条线来居中设置焦点的元素?
public partial class PdfDetailElement : UserControl
{
    public PdfDetailElement()
    {
        InitializeComponent();
    }

    public PdfDetailElement(ImageBrush image)
    {
        DataContext = Gui.Main.CanvasSettings;
        InitializeComponent();
        inkCanvas.Background = image;
        inkCanvas.Width = image.ImageSource.Width;
        inkCanvas.Height = image.ImageSource.Height;
    }
}
Focusable="False"