我正在编写一个WPF程序,我试图通过一些可重复的方法(如样式或模板)找出一种在TextBox中格式化数据的方法.我有很多TextBoxes(确切地说是95),每一个都绑定到自己的数值数据,每个数据都可以定义自己的分辨率.例如,如果数据为99.123,分辨率为2,则应显示99.12.同样,数据值99和分辨率3应显示为99.000(而不是99).有没有办法做到这一点?
编辑: 我应该澄清一下,我正在处理的当前屏幕上有95个TextBox,但我希望程序中各个屏幕的每个TextBox都能显示正确的小数位数.现在我考虑一下,其中一些是TextBoxes(就像我现在正在处理的屏幕),有些是DataGrids或ListViews,但是如果我能弄清楚如何使它适用于TextBoxes我敢肯定我可以想象它也用于其他控件.
在这种情况下,没有太多的代码可以共享,但我会尝试使其更清晰:
我有一个View Model,它包含以下属性(vb.net):
Public ReadOnly Property Resolution As Integer
Get
Return _signal.DisplayResolution
End Get
End Property
Public ReadOnly Property Value As Single
Get
Return Math.Round(_signal.DisplayValue, Resolution)
End Get
End Property
Run Code Online (Sandbox Code Playgroud)
在XAML中我有:
<UserControl.Resources>
<vm:SignalViewModel x:Key="Signal" SignalPath="SomeSignal"/>
</UserControl.Resources>
<TextBox Grid.Column="3" IsEnabled="False" Text="{Binding Path=Value, Source={StaticResource Signal}, Mode=OneWay}" />
Run Code Online (Sandbox Code Playgroud)
EDIT2(我的解决方案): 事实证明,在离开电脑一段时间之后,我回来找到一个简单的答案,盯着我的脸.格式化视图模型中的数据!
Public ReadOnly Property Value As String
Get
Return (Strings.FormatNumber(Math.Round(_signal.DisplayValue, _signal.DisplayResolution), _signal.DisplayResolution))
End Get
End Property
Run Code Online (Sandbox Code Playgroud) 我是新手,WPF
并试图让自定义用户控件基于a进行动画制作DependencyProperty
.我有绑定使用a DataTrigger
.如果DependencyProperty
等于Failure,则应为用户控件中的矩形(名为buttonColor)的填充颜色设置动画.但是出于某种原因,即使我将RepeatBehavior设置为6(或任何其他数字,包括1),它也会永远循环.如果我删除RepeatBehavior属性,它只播放一次动画(如预期的那样).如果有人可以查看我下面的XAML摘录并告诉我我做错了什么,我将不胜感激.
<DataTrigger Binding="{Binding Path=ButtonAction.Status}" Value="Failure">
<DataTrigger.EnterActions>
<StopStoryboard BeginStoryboardName="Pulse"/>
<BeginStoryboard>
<Storyboard RepeatBehavior="1">
<ColorAnimation Storyboard.TargetName="buttonColor" Storyboard.TargetProperty="Fill.Color" To="{StaticResource FailedColor}" AutoReverse="True" />
</Storyboard>
</BeginStoryboard>
</DataTrigger.EnterActions>
</DataTrigger>
Run Code Online (Sandbox Code Playgroud) 我有一个按钮,需要执行两个单独的命令(一个启动一个东西,一个停止它).在做了一些研究后,System.Windows.Interactivity.dll似乎提供了一种简单的方法来实现这一目标.但它不适用于鼠标左键(如果我使用像MouseDoubleClick或MouseRightButtonDown这样的事件,但不是MouseDown,MouseUp或MouseRightButtonDown,它确实有效)......好像按钮消耗了事件本身和交互.trigger永远不会看到它.我在下面提供了我的XAML片段,我该怎么做才能绕过这种行为?
<Button Content="DoStuff">
<i:Interaction.Triggers>
<i:EventTrigger EventName="MouseDown">
<i:InvokeCommandAction Command="{Binding StartCommand}" />
</i:EventTrigger>
<i:EventTrigger EventName="MouseUp">
<i:InvokeCommandAction Command="{Binding StopCommand}" />
</i:EventTrigger>
</i:Interaction.Triggers>
</Button>
Run Code Online (Sandbox Code Playgroud) 我在尝试弄清楚如何滚动包含在滚动查看器内的网格内容时遇到了一些问题.当尝试使用鼠标滚轮或平移(使用触摸屏)滚动时,如果鼠标/触摸点位于空白区域上,则网格会滚动,但如果它高于某些控件(例如,组合框)则会赢得"滚动.是否有一些我缺少的属性允许子面板允许它们滚动它们的父容器?
编辑: 我错误地说明了我原来的布局.这是我的senario的简化版本:
<Grid>
<ScrollViewer Name="MainScrollViewer">
<StackPanel>
<ListBox /> <--Doesn't Scroll-->
<Button /> <--Scrolls Fine-->
<TextBlock /> <--Scrolls Fine-->
<TextBox /> <--Scrolls Fine-->
<DataGrid /> <--Doesn't Scroll-->
</StackPanel>
</ScrollViewer>
</Grid>
Run Code Online (Sandbox Code Playgroud)
一位同事指出我的问题是由于ListBoxes和DataGrids等控件本身包含ScrollViewers,这是有道理的.他的建议(可行,但我们都同意似乎比它应该更复杂)是捕获并重新抛出后面代码中的滚动事件(并且可能必须处理计算滚动的偏移量)以便它可以冒泡到"MainScrollViewer".
编辑2: 似乎实现此目的的唯一方法是使用后台代码来处理父级中的PreviewMouseWheel事件.这是有效的,但我如何实现相同的平移(用手指在触摸屏上滚动)?