我是一個使用WPF的新手,但非常像在視圖模型中編寫視圖代碼和xaml以及支持代碼的想法。我想要做的就是擴展Canvas的使用,方法是將它與狀態欄關聯起來,狀態欄根據Canvas的內容和鼠標位置(下面的程式化代碼不包含此內容)顯示狀態文本。如何訪問WPF UserControl中的Canvas?
我的方法是創建一個包含Canvas並將ContentPresenter放入其中的UserControl,每個https://www.codeproject.com/Articles/82464/How-to-Embed-Arbitrary-Content-in-a-WPF-Control。
我有兩個問題需要解決: 1)我需要做什麼才能以Canvas允許多個子控件的相同方式允許多個子控件? 2)如何從主窗口代碼訪問Canvas的屬性,例如Canvas.Left?
在此先感謝您的任何建議。
用戶控件XAML代碼,用戶控件的代碼後面,主窗口XAML代碼:背後
<UserControl x:Class="SO.CanvasUserControl"
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:local="clr-namespace:SO"
mc:Ignorable="d"
d:DesignHeight="300" d:DesignWidth="300">
<UserControl.Template>
<ControlTemplate TargetType="{x:Type local:CanvasUserControl}">
<Canvas Width="200" Height="100" Background="Green">
<ContentPresenter/>
</Canvas>
</ControlTemplate>
</UserControl.Template>
</UserControl>
代碼:
public partial class CanvasUserControl : UserControl
{
public CanvasUserControl()
{
InitializeComponent();
}
}
主窗口:
<Window x:Class="SO.MainWindow"
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="clr-namespace:SO"
mc:Ignorable="d"
Title="MainWindow" Height="350" Width="525">
<Grid>
<!-- works as expected
<Canvas Width="200" Height="100" Background="Green">
<Line X1="0" Y1="0" X2="200" Y2="100" Stroke="Red"/>
<Line X1="200" Y1="0" X2="0" Y2="100" Stroke="Red"/>
</Canvas>
-->
<!-- works as expected
<Canvas Width="200" Height="100" Background="Green" x:Name="MyCanvas">
<Line X1="{Binding ElementName=MyCanvas, Path=Left}" Y1="{Binding ElementName=MyCanvas, Path=Top}" X2="{Binding ElementName=MyCanvas, Path=ActualWidth}" Y2="{Binding ElementName=MyCanvas, Path=ActualHeight}" Stroke="Red"/>
<Line X1="{Binding ElementName=MyCanvas, Path=ActualWidth}" Y1="{Binding ElementName=MyCanvas, Path=Top}" X2="{Binding ElementName=MyCanvas, Path=Left}" Y2="{Binding ElementName=MyCanvas, Path=ActualHeight}" Stroke="Red"/>
</Canvas>
-->
<!-- How do I add more than one child control as nested content for the Canvas?
<local:CanvasUserControl x:Name="MyCanvasUserControl">
<Line X1="0" Y1="0" X2="200" Y2="100" Stroke="Red"/>
<Line X1="200" Y1="0" X2="0" Y2="100" Stroke="Green"/>
</local:CanvasUserControl>
-->
<!-- How do I access dependency properties of the Canvas?
<local:CanvasUserControl x:Name="MyCanvasUserControl">
<Line X1="{Binding ElementName=MyCanvasUserControl, Path=Left}" Y1="{Binding ElementName=MyCanvasUserControl, Path=Top}" X2="{Binding ElementName=MyCanvasUserControl, Path=ActualWidth}" Y2="{Binding ElementName=MyCanvasUserControl, Path=ActualHeight}" Stroke="Red"/>
</local:CanvasUserControl>
-->
</Grid>
</Window>
'UserControl'繼承自'ContentControl'。它有一個'Object'屬性,類型爲'Object'。我不確定你真正想要的是一個'UserControl'。你是否希望能夠將Canvas的一些屬性捲成某種捆綁包,並將它們一起重用?這可以很容易地完成,但我會用Style來做。 –
我想要做的是創建一個類似Canvas的可重用控件,但它下面還有一個StatusBar。我打算使用它的每個項目都會在「畫布兒童」列表中顯示任何想要的內容,例如兩條對角線。實際上,我已經獲得了所有這些代碼的工作,但厭倦了複製粘貼20到30行xaml以及ViewModel代碼,這會消耗鼠標位置並返回狀態欄文本。從我在StackOverflow以及其他網站上閱讀的背景中,UserControl似乎是一種可行的方式。 – Lars12345
定義「任何想要的」。 –