如果我有一个派生的组件ItemsControl,我可以访问它的子集合,以便我可以循环它们来执行某些操作吗?我现在似乎找不到任何简单的方法.
这是场景:
我有以下用户控件,想法是它的视图模型应该能够向视图发出信号,它需要"激活发光",从而播放故事板.
<UserControl x:Class="View.UnitView" ... >
...
<Storyboard x:Key="ActivateGlow">
...
</Storyboard>
...
<!-- INVALID BINDING! Not Dependancy Object-->
<EventTrigger RoutedEvent="{Binding OnActivateGlow}">
<BeginStoryboard Storyboard="{StaticResource ActivateGlow}"/>
</EventTrigger>
</UserControl>
Run Code Online (Sandbox Code Playgroud)
在UnitView的代码隐藏中,我有:
public event EventHandler ActivateGlow;
Run Code Online (Sandbox Code Playgroud)
并且在MVVM中非常正常,我为UnitViewModel提供了以下DataTemplate:
<DataTemplate DataType="{x:Type vm:UnitViewModel}">
<vw:UnitView d:DesignWidth="150" d:DesignHeight="100" />
</DataTemplate>
Run Code Online (Sandbox Code Playgroud)
最后一个问题是,我如何设置一些东西,以便viewmodel可以触发OnActivateGlow事件?
也许是一个愚蠢的问题,但是当我将项目添加到WPF项目时,Visual Studio只提供UserControl,而不是Window.这是试图鼓励我做MVVM,我的设置是否被打破,还是有其他原因我没有想到?
通常,WPF控件在.xaml文件中声明,而不是在后面的代码中声明(.xaml.cs文件).但是,有时我需要在代码中使用其中的一些控件来操作它们.如果它"驻留"在xaml文件中,我如何获得这种控件的句柄?
我有一个ViewModel类,它有很多属性(Say 50).将数据设置为我需要更新UI的所有属性.我知道常见的解决方案是在所有属性设置器上引发PropertyChanged.
我想知道是否有任何方法可以通过单个通知通知我的DataTemplate更新其所有绑定?一个想法是使用IsLoaded属性来提高属性,但是如何使用它来更新整个DataTemplate.我对整个XAML解决方案感兴趣.
我有什么?
我有一个ListBoxXML文件中的项目.给定DynamicResource的Style财产和书面触发器IsSelected在ItemContainerStyle.
我想做什么?
即使焦点移出后,我仍希望保持所选项目突出显示ListBox.
我面临什么问题?
当我选择一个项目时,IsSelected触发器中指定的样式有效.但是,当我将焦点移出列表框(按Tab键或单击其他控件)时,所选项目将失去其样式.有什么方法可以保留所选的项目风格吗?
提前致谢!
在Silverlight 3.0应用程序中,我试图在画布中创建一个矩形,并使其拉伸画布的整个宽度.我试图通过绑定到ActualWidth父容器的属性(下面的示例)来做到这一点,但是当我没有看到任何绑定错误时,该值没有被绑定.矩形不可见,因为其宽度为零.另外尝试绑定到ActualWidth包含我的矩形的画布,但这没有区别.
我确实发现Microsoft Connect上记录了此错误,但没有列出变通方法.
有没有人能够解决这个问题,还是他们可以指出解决方案?
编辑:原始代码示例不准确我想要实现的目标,更新更清晰.
<UserControl>
<Border BorderBrush="White"
BorderThickness="1"
CornerRadius="4"
HorizontalAlignment="Center">
<Grid x:Name="GridContainer">
<Rectangle Fill="Aqua"
Width="150"
Height="400" />
<Canvas>
<Rectangle Width="{Binding Path=ActualWidth, ElementName=GridContainer}"
Height="30"
Fill="Red" />
</Canvas>
<StackPanel>
<!-- other elements here -->
</StackPanel>
</Grid>
</Border>
</UserControl>
Run Code Online (Sandbox Code Playgroud) 我想知道我所有物品的高度StackPanel.
有什么区别:
Height - 获取或设置元素的建议高度. ActualHeight - 获取此元素的渲染高度.(只读)ExtentHeight - 获取包含范围的垂直大小的值.(只读)ViewportHeight - 获取包含内容视口的垂直大小的值.(只读)DesiredSize - 获取此元素在布局过程的度量传递期间计算的大小.(只读)RenderSize - 获取(或设置,但请参阅备注)此元素的最终渲染大小.来自MSDN:
Height
获取或设置元素的建议高度.属性值:
Double- 元素的高度,与设备无关的单位(每单位1/96英寸).元件的高度,与设备无关的单位(每单位1/96英寸).
ActualHeight( readonly)
获取此元素的渲染高度.属性值:
Double- 元素的高度,作为与设备无关的单位中的值(每单位1/96英寸).此属性是基于其他高度输入和布局系统的计算值.该值由布局系统本身根据实际渲染过程设置,因此可能略微落后于作为输入更改基础的高度等属性的设置值.
因为ActualHeight是一个计算值,所以您应该知道,由于布局系统的各种操作,可能会有多个或增量报告的更改.布局系统可以计算子元素所需的度量空间,父元素的约束等等.
ExtentHeight( readonly)
获取包含范围的垂直大小的值.属性高度:
Double- 表示范围的垂直大小的Double.返回值在"设备无关像素"中描述.
ViewportHeight( readonly)
获取一个值,该值包含内容视口的垂直大小.属性值:
Double- 表示内容视口的垂直大小的Double.返回值在"设备无关像素"中描述.
DesiredSize( readonly)
获取此元素在布局过程的度量传递期间计算的大小. …
如何更改继承的依赖项属性的默认值?在我们的例子中,我们创建了一个Control的子类,默认情况下它的Focusable设置为'true'.我们希望我们的子类具有默认值'false'.
我们一直在做的只是在构造函数中将其设置为'false',但如果有人使用ClearValue,它将返回默认值,而不是构造函数中设置的值.
以下是我目前正在做的事情(这是一个带有'Foo'DP的测试控件的例子.)我不是隐藏属性的'新'的粉丝虽然感谢AddOwner,但它确实指出了到同一个共享实例所以我猜它没关系.它看起来像是继承了所有其他元数据值,所以这很好.只是想知道这是否正确?
public class TestControlBase : Control
{
public static readonly DependencyProperty FooProperty = DependencyProperty.Register(
"Foo",
typeof(int),
typeof(TestControlBase),
new FrameworkPropertyMetadata(4) // Original default value
);
public int Foo
{
get { return (int)GetValue(FooProperty); }
set { SetValue(FooProperty, value); }
}
}
public class TestControl : TestControlBase
{
public static readonly new DependencyProperty FooProperty = TestControlBase.FooProperty.AddOwner(
typeof(TestControl),
new FrameworkPropertyMetadata(67) // New default for this subclass
);
}
Run Code Online (Sandbox Code Playgroud)
标记
更新中...
我认为这更好,因为它消除了"新"呼叫.您仍然可以通过基类上的FooProperty访问它,因为它使用了AddOwner.因此,它在技术上是相同的.
public class TestControl : …Run Code Online (Sandbox Code Playgroud) 创建一个UserControl应该能够包含WPF中可用的任何可视子项的子项,子项显示在一个容器中,该容器是一个子容器UserControl.
我无法设法让我的容器中的孩子正确显示,我尝试了serval方式,并没有找到一种适用于设计师的方法.我也尝试使用ContentControl但没有显示任何内容.
首先,我找到了这个链接,我尝试了一些变化.我设法在正确的容器中显示内容,但它在设计器中不起作用,因为content-property是set-private而设计者想要覆盖它.将所有内容放在XAML中都有效,但在与设计师合作时这并不好.这可能是最喜欢的方式.
在此之后我试图ContentControl通过将它的Content-property绑定到UIElementCollection-type 的可绑定属性来使用.这种方法不会给设计师带来任何错误,但我必须承认我从未Button在容器中看到任何控件(例如a ).它保持空白但添加了孩子.
经过一段时间寻找一个简单快捷的解决方案后,我决定在这里寻求解决方案.我有点失望.如果微软可以将样本带入MSDN,那将非常有用.
我确信必须有一种简单的方法来存档.
感谢Andrei Gavrila和jberger,我将其存档以创建一个显示内容的节点(请参阅下面的代码),但仍有两个问题: - 没有设计师支持 - 边框(请参阅xaml)未在设计器中显示,并且在应用程序时未显示正在运行甚至没有保证金
public class NodeContent : ContentControl
{
static NodeContent()
{
DefaultStyleKeyProperty.OverrideMetadata(typeof(NodeContent), new FrameworkPropertyMetadata(typeof(NodeContent)));
}
}
public partial class Node : UserControl, INotifyPropertyChanged
{
UIElementCollection _Elements;
public event PropertyChangedEventHandler PropertyChanged;
public UIElementCollection NodeContent
{
get { return _Elements; }
set
{
_Elements = …Run Code Online (Sandbox Code Playgroud) wpf ×9
c# ×2
mvvm ×2
actualwidth ×1
controls ×1
data-binding ×1
events ×1
eventtrigger ×1
height ×1
itemscontrol ×1
layout ×1
listbox ×1
scaling ×1
silverlight ×1
stackpanel ×1
styles ×1
subclass ×1
window ×1
wpf-controls ×1
xaml ×1