source

스타일/템플릿을 사용하여 소수 자릿수를 wpf 형식으로 지정하는 방법은 무엇입니까?

nicesource 2023. 5. 4. 20:02
반응형

스타일/템플릿을 사용하여 소수 자릿수를 wpf 형식으로 지정하는 방법은 무엇입니까?

저는 WPF 프로그램을 작성하고 있으며 스타일이나 템플릿과 같은 반복 가능한 방법을 통해 텍스트 상자의 데이터를 포맷하는 방법을 찾고 있습니다.저는 많은 텍스트 상자(정확히는 95개)를 가지고 있으며, 각각의 텍스트 상자는 각각 고유한 해상도를 정의할 수 있는 고유한 숫자 데이터에 바인딩되어 있습니다.예를 들어, 데이터가 99.123이고 분해능이 2이면 99.12가 표시됩니다.마찬가지로 데이터 값 99와 분해능 3은 99.000(99가 아님)으로 표시되어야 합니다.이것을 할 수 있는 방법이 있습니까?

편집: 제가 작업 중인 현재 화면에는 95개의 텍스트 상자가 있지만, 프로그램의 다양한 화면 전체에 있는 모든 텍스트 상자에 소수점 이하의 정확한 숫자가 표시되도록 해야 합니다.지금 생각해 보면, 이 중 일부는 텍스트 상자(지금 작업 중인 화면과 같은)이고 일부는 데이터 그리드 또는 목록 보기입니다. 하지만 텍스트 상자에서 작동하는 방법을 알아낼 수 있다면 다른 컨트롤에서도 문제를 해결할 수 있을 것입니다.

이 경우 공유할 코드는 많지 않지만 더 명확하게 설명하겠습니다.

다음 속성이 포함된 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

그리고 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}" />

EDIT2(내 솔루션):컴퓨터에서 잠시 벗어난 후에 제 얼굴을 빤히 쳐다보는 간단한 대답을 찾아냈습니다.뷰 모델의 데이터 형식 지정!

    Public ReadOnly Property Value As String
        Get
            Return (Strings.FormatNumber(Math.Round(_signal.DisplayValue, _signal.DisplayResolution), _signal.DisplayResolution))
        End Get
    End Property

다음을 사용해야 합니다.StringFormat에서Binding표준 문자열 형식 또는 사용자 지정 문자열 형식을 사용할 수 있습니다.

<TextBox Text="{Binding Value, StringFormat=N2}" />
<TextBox Text="{Binding Value, StringFormat={}{0:#,#.00}}" />

참고:StringFormat대상 속성이 문자열 유형일 때만 작동합니다.만약 당신이 무언가를 설정하려고 한다면,Content속성(typeof(object)), 사용자 정의를 사용해야 합니다.StringFormatConverter(여기처럼) 형식 문자열을 다음과 같이 전달합니다.ConverterParameter.

업데이트된 질문에 대한 편집

그래서, 만약 당신이ViewModel정밀도를 정의합니다. 저는 이것을 하는 것을 추천합니다.MultiBinding그리고 나만의 것을 만드는 것.IMultiValueConverter이것은 단순한 바인딩에서 확장이 필요한 바인딩으로 가는 것은 실제로 꽤 성가신 일입니다.MultiBinding하지만 컴파일할 때 정확도를 알 수 없다면, 이것이 당신이 할 수 있는 거의 모든 것입니다.당신의.IMultiValueConverter값과 정밀도를 가져와 형식화된 문자열을 출력해야 합니다.다음을 사용하여 이 작업을 수행할 수 있습니다.String.Format.

, 하만지와 이것들위해을런위해▁however▁a.ContentControl당신은 이것을 훨씬 더 쉽게 할 수 있습니다.Style:

<Style TargetType="{x:Type ContentControl}">
    <Setter Property="ContentStringFormat" 
            Value="{Binding Resolution, StringFormat=N{0}}" />
</Style>

▁a▁를 노출시키는 모든 컨트롤.ContentStringFormat이렇게 사용할 수 있습니다. 불하게도행,,TextBox그런 것은 없습니다.

허용된 답은 0.299와 같은 입력을 제공할 때 정수 자리에 0을 표시하지 않습니다.WPF UI에서 .3을 표시합니다.그래서 다음 문자열 형식을 사용할 것을 제안합니다.

<TextBox Text="{Binding Value,  StringFormat={}{0:#,0.0}}" 
    void NumericTextBoxInput(object sender, TextCompositionEventArgs e)
    {
        TextBox txt = (TextBox)sender;
        var regex = new Regex(@"^[0-9]*(?:\.[0-9]{0,1})?$");
        string str = txt.Text + e.Text.ToString();
        int cntPrc = 0;
        if (str.Contains('.'))
        {
            string[] tokens = str.Split('.');
            if (tokens.Count() > 0)
            {
                string result = tokens[1];
                char[] prc = result.ToCharArray();
                cntPrc = prc.Count();
            }
        }
        if (regex.IsMatch(e.Text) && !(e.Text == "." && ((TextBox)sender).Text.Contains(e.Text)) && (cntPrc < 3))
        {
            e.Handled = false;
        }
        else
        {
            e.Handled = true;
        }
    }

언급URL : https://stackoverflow.com/questions/18361689/how-to-format-number-of-decimal-places-in-wpf-using-style-template

반응형