我有一個UserControl,它包含一個InkToolbar。在這個控制元件中,我正在根據用戶的輸入生成另一組UserControls。在每一個以編程方式生成的控制元件中,包含一個InkCanvas。
這是其父UserControl & 后面的代碼。
Main.xaml
<UserControl。
x:Class="uwp.Main"。
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"。
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"。
xmlns:local="using:uwp_mvvm"。
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"。
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"。
mc:Ignorable="d"。
d:DesignHeight="300"。
d:DesignWidth="400">>
<Grid>/span>
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition />
</Grid.RowDefinitions>
<StackPanel Orientation="Horizontal" Grid. Row="0"/span>>
<InkToolbar x: Name="InkToolbar" Background="Black" Margin="10 0 0 0" VerticalAlignment="Center"/span>/>
</StackPanel>/span>
< ScrollViewer ZoomMode="Enabled" Background="DarkGray" x。 名稱="ScrollViewer" VerticalScrollBarVisibility="Auto" HorizontalScrollBarVisibility="Auto"/span> MinZoomFactor="0。 25" Width="Auto" Height="Auto" MaxZoomFactor="4" Grid. Row="1">
< StackPanel Orientation="Vertical"/span> VerticalAlignment="Center"/span> HorizontalAlignment="Center"/span>>
<ItemsControl x:Name="PagesItemsControl"/span> ItemsSource="{x: Bind Pages, Mode=OneWay}" HorizontalAlignment="Center" VerticalAlignment="Top">
<ItemsControl.ItemsPanel>/span>
<ItemsPanelTemplate>
<WrapGrid Orientation="Vertical"/>
</ItemsPanelTemplate>/span>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemTemplate>
<DataTemplate>/span>
<local:TestControl x: Name="TestControl" Page="{Binding}" Margin="4 4" InkToolbarControl="{Binding Path=InkToolbar, ElementName=InkToolbar}" />
</DataTemplate>
</ItemsControl.ItemTemplate>/span>
</ItemsControl>
</StackPanel>/span>
</ScrollViewer>/span>
</Grid>/span>
</UserControl>
Main.xaml.cs
public sealed partial class MainViewer 。UserControlpublic MainViewer()
{
this.InitializeComponent()。
}
private void EventTriggerChanged(object sender, PropertyChangedEventArgs e)。
{
var trigger = sender as EventTriggerTestControl;
if (trigger != null)
RaiseChanged(e.PropertyName)。
}
public event PropertyChangedEventHandler PropertyChanged;
private void RaiseChanged(string propName)
{
if (PropertyChanged != null)
PropertyChanged.Invoke(this, new PropertyChangedEventArgs(propName))。
}
private PdfDocument pdfDocument = null;
private string password = string.empty;
private ObservableCollection< PdfPage> pages = new ObservableCollection<PdfPage> ();
public string Password
{
private get { return password; }
set { if (value !=password) { password = value; } }
}
public ObservableCollection<PdfPage> Pages
{
get { return pages; }
set { if (value != pages) { pages = value; } }
}
public StorageFile File
{
get { return (StorageFile)GetValue(FileProperty); }
set { SetValue(FileProperty, value); }
}
public static readonly DependencyProperty FileProperty =
DependencyProperty. Register(nameof(File), typeof(StorageFile), typeof(MainViewer), new PropertyMetadata(null, new PropertyChangedCallback(OnDocumentChanged)) )。
private static void OnDocumentChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)。
{
if (object.Equals(e.NewValue, e.OldValue) || e.NewValue is null)
return;
d.RegisterPropertyChangedCallback(FileProperty, CaptureDocument)。
}
private async static void CaptureDocument(DependencyObject sender。DependencyProperty dp) => await(sender as MainViewer)。 OpenFileAsync(sender.GetValue(dp) as StorageFile)。
private async Task OpenFileAsync(StorageFile file)
{
try
{
if (file == null)
throw new ArgumentNullException(nameof(file)>)。
var files = await ApplicationData.Current.LocalFolder.GetFilesAsync(CommonFileQuery.OrderByName)。
if (files.Where(x => x.Name == file.Name).ToList().Count == 0)
await file.CopyAsync(ApplicationData.Current.LocalFolder, file.Name, NameCollisionOption.ReplaceExisting) 。
file = await ApplicationData.Current.LocalFolder.GetFileAsync(file.Name)。
pdfDocument = new PdfDocument(file.Path, Password)。
pdfDocument.Pages.ToList().ForEach(x => Pages.Add(x))。
}
catch (Exception ex) { throw ex; }
}
}
我想使用InkToolbar,它在TestControl內部的父控制元件中。
TestControl.xaml
<UserControl。
x:Class="uwp.TestControl"。
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"。
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"。
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"。
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"。
xmlns:local="using:uwp_mvvm.ViewModels" xmlns: converter="using:uwp_mvvm"
mc:Ignorable="d"。
d:DesignHeight="300"。
d:DesignWidth="400">>
<UserControl.Resources>/span>
<converter:BoolToVisibilityConverter x:Key="BoolToVisibilityConverter" />/span>
</UserControl.Resources>
<Grid x: Name="Viewport" VerticalAlignment="Top" HorizontalAlignment="Center">
<Border x: Name="ViewportBorder" Background="白色" BorderThickness="2。2, 2, 2" BorderBrush="#FF353334" />
<Image x: Name="Image" Margin="0" UseLayoutRounding="True"/span> ManipulationMode="Scale"/>
<Canvas x: Name="SelectionCanvas" CompositeMode="MinBlend" Opacity="1"/>
<InkCanvas x:Name="InkCanvas"/span> />
</Grid>
</UserControl>
TastControl.xaml.cs
public sealed partial class TestControl 。UserControlprivate const float DPI = 256;
public PdfPage Page
{
get { return (PdfPage)GetValue(PageProperty); }
set { SetValue(PageProperty, value); }
}
public static readonly DependencyProperty PageProperty =
DependencyProperty. Register(nameof(Page), typeof(PdfPage), typeof(TestControl) 。new PropertyMetadata(null, new PropertyChangedCallback(OnPageChanged))。
private static void OnPageChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)。
{
if (object.Equals(e.NewValue, e.OldValue) || e.NewValue is null)
return;
d.RegisterPropertyChangedCallback(PageProperty, CapturePage)。
}
private static void CapturePage(DependencyObject sender, DependencyProperty dp) => (sender as TestControl)。 RenderPage(sender.GetValue(dp) as PdfPage)。
public InkToolbar InkToolbarControl
{
get { return (InkToolbar)GetValue(InkToolbarControlProperty); }
set { SetValue(InkToolbarControlProperty,value); }
}
public static readonly DependencyProperty InkToolbarControlProperty =
DependencyProperty. Register(nameof(InkToolbarControl), typeof(InkToolbar), typeof(TestControl), new PropertyMetadata(null))。
public TestControl()
{
this.InitializeComponent()。
ConfigureInkCanvas();
}
private void ConfigureInkCanvas()
{
InkCanvas.InkPresenter.InputDeviceTypes = CoreInputDeviceTypes.Mouse | CoreInputDeviceTypes.Pen | CoreInputDeviceTypes.Touch。
InkCanvas.InkPresenter.InputProcessingConfiguration.Mode = InkInputProcessingMode.None。
InkCanvas.InkPresenter.UpdateDefaultDrawingAttributes(
new InkDrawingAttributes
{
IgnorePressure = false,
FitToCurve = true,
顏色 = Colors.Black,
筆尖 = PenTipShape.Circle
});
InkCanvas.InkPresenter.UnprocessedInput.PointerEntered -= InkCanvasUnprocessedInputPointerEntered。
InkCanvas.InkPresenter.UnprocessedInput.PointerEntered = InkCanvasUnprocessedInputPointerEntered。
InkCanvas.InkPresenter.UnprocessedInput.PointerExited -= InkCanvasUnprocessedInputPointerExited。
InkCanvas.InkPresenter.UnprocessedInput.PointerExited = InkCanvasUnprocessedInputPointerExited。
}
private void InkCanvasUnprocessedInputPointerExited(InkUnprocessedInput sender。PointerEventArgs)。
{
//InkCanvas.InkPresenter.InputProcessingConfiguration.Mode = InkInputProcessingMode.Inking;
//InkToolbarControl.TargetInkCanvas = InkCanvas;。
}
private void InkCanvasUnprocessedInputPointerEntered(InkUnprocessedInput sender。PointerEventArgs)。
{
//InkCanvas.InkPresenter.InputProcessingConfiguration.Mode = InkInputProcessingMode.None;
//InkToolbarControl.TargetInkCanvas = null;。
}
private void RenderPage(PdfPage page, float dpi = DPI)。
{
if (page is null)
return;
this.DataContext = page;
var width = (DataContext as PdfPage).Width;
var height = (DataContext as PdfPage).Height;
var writableBitmap = new WriteableBitmap((int)(width / 72f * dpi) 。(int)(height / 72f * dpi)。
(DataContext as PdfPage).Render(writableBitmap, PageOrientations.Normal, RenderingFlags.Annotations) 。
Image.Width = width;
Image.Height = height;
Image.Source = writableBitmap;
SelectionCanvas.Width = width;
SelectionCanvas.Height = height;
InkCanvas.Width = width;
InkCanvas.Height = height。
Canvas.SetZIndex(Image, 0)。
ConfigureInkCanvas();
}
我嘗試使用DependencyProperty來發送InkToolbar到TestControl,但似乎并不成功。
有人能幫我解決這個問題嗎?我不確定是否也可以像這樣設定 TargetInkCanvas。所以,如果有更好的方法,也請大家提出建議。
如果有任何幫助,我將非常感激。
非常感謝任何幫助。謝謝。
uj5u.com熱心網友回復:
通過編程生成的子元素訪問放置在父元素中的InkToolbar
以上使用DependencyProperty來傳遞父元素
InkToolBar的解決方案是正確的。但是你為InkToolbarControl屬性系結了錯誤的值。請直接系結ElementName,而不是路徑。
<local: TestControl x:Name="TestControl"。 Margin="4,4"。 InkToolbarControl="{Binding ElementName=InkToolbar}" />然后更新
InkCanvasUnprocessedInputPointerExited和InkCanvasUnprocessedInputPointerEntered流程邏輯。private void InkCanvasUnprocessedInputPointerExited(InkUnprocessedInput sender。PointerEventArgs)。 { InkCanvas.InkPresenter.InputProcessingConfiguration.Mode = InkInputProcessingMode.Inking。 InkToolbarControl.TargetInkCanvas = null; } private void InkCanvasUnprocessedInputPointerEntered(InkUnprocessedInput sender。PointerEventArgs)。 { InkCanvas.InkPresenter.InputProcessingConfiguration.Mode = InkInputProcessingMode.None。 InkToolbarControl.TargetInkCanvas = InkCanvas;轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/312717.html
標籤:
