CultureInfo ändert das Ausgabeformat von Datum nicht wenn per Laufzeit gesetzt.

  • WPF

Es gibt 16 Antworten in diesem Thema. Der letzte Beitrag () ist von ErfinderDesRades.

    CultureInfo ändert das Ausgabeformat von Datum nicht wenn per Laufzeit gesetzt.

    Hallöchen,


    ich versuche gerade nachdem Tutorial von @Nofear23m die Culture zu setzten per Code nicht im XAML.
    Allerdings wenn ich dies mache bleibt das Datumformat immer noch auf dem Englischen obwohl die Culture auf de-DE steht.

    Mal hier der komplette XAML:
    Spoiler anzeigen

    XML-Quellcode

    1. ​<Window x:Class="xCrawler.MainWindow"
    2. xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    3. xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    4. xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    5. xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    6. xmlns:local="clr-namespace:xCrawler"
    7. xmlns:vms="clr-namespace:xCrawler.Klassen"
    8. mc:Ignorable="d"
    9. Title="MainWindow" Height="477.057" Width="882.595" Loaded="Window_Loaded">
    10. <Window.DataContext>
    11. <vms:MainWindowViewModel/>
    12. </Window.DataContext>
    13. <Grid>
    14. <Grid.ColumnDefinitions>
    15. <ColumnDefinition Width="130"/>
    16. <ColumnDefinition Width="130"/>
    17. <ColumnDefinition Width="100*"/>
    18. </Grid.ColumnDefinitions>
    19. <Grid.RowDefinitions>
    20. <RowDefinition Height="40*"/>
    21. <RowDefinition Height="327*"/>
    22. <RowDefinition Height="52*"/>
    23. </Grid.RowDefinitions>
    24. <Button Content="Lade Daten" Grid.Row="0" Grid.Column="0" Margin="5" Width="120" Height="30" Command="{Binding GetVideosCommand}"/>
    25. <Button Content="Prüfe neue Videos" Grid.Row="0" Grid.Column="1" Margin="5" Width="120" Height="30" Command="{Binding TestCommand}"/>
    26. <ListBox Grid.Row="1" Grid.ColumnSpan="3" ItemsSource="{Binding Videos}" SelectedItem="{Binding SelectedVideo}">
    27. <ListBox.ItemTemplate>
    28. <DataTemplate>
    29. <Grid>
    30. <Grid.ColumnDefinitions>
    31. <ColumnDefinition Width="120"/>
    32. <ColumnDefinition Width="*"/>
    33. </Grid.ColumnDefinitions>
    34. <Image Margin="5" Grid.Column="0" Source="{Binding Image}" RenderOptions.BitmapScalingMode="HighQuality"/>
    35. <StackPanel Grid.Column="1" Orientation="Vertical" VerticalAlignment="Center">
    36. <TextBlock Grid.Column="1" Text="{Binding Titel}" FontWeight="Bold"/>
    37. <TextBlock Grid.Column="1">
    38. <Run Text="{Binding VideoId}"/>
    39. <Run Text=" | "/>
    40. <Run Text="{Binding DateAdded}"/>
    41. </TextBlock>
    42. <TextBlock Grid.Column="1" Text="{Binding Status}"/>
    43. </StackPanel>
    44. </Grid>
    45. </DataTemplate>
    46. </ListBox.ItemTemplate>
    47. </ListBox>
    48. <TextBlock Grid.Row="2" Grid.ColumnSpan="3" VerticalAlignment="Center" HorizontalAlignment="Center" Text="{Binding SelectedVideo.Titel}"/>
    49. </Grid>
    50. </Window>


    Das "MainWindowViewModel" sieht wie folgt aus:
    Spoiler anzeigen

    C#-Quellcode

    1. ​using System;
    2. using System.Collections.Generic;
    3. using System.Collections.ObjectModel;
    4. using System.ComponentModel;
    5. using System.Linq;
    6. using System.Text;
    7. using System.Threading;
    8. using System.Threading.Tasks;
    9. using System.Windows;
    10. using System.Windows.Input;
    11. namespace xCrawler.Klassen
    12. {
    13. public class MainWindowViewModel : BaseModel
    14. {
    15. private ObservableCollection<Video> _videos;
    16. public ObservableCollection<Video> Videos
    17. {
    18. get { return _videos; }
    19. set
    20. {
    21. if (Equals(value, _videos)) return;
    22. _videos = value;
    23. OnPropertyChanged();
    24. }
    25. }
    26. private Video _selectedvideo;
    27. public Video SelectedVideo
    28. {
    29. get { return _selectedvideo; }
    30. set
    31. {
    32. if (Equals(value, _selectedvideo)) return;
    33. _selectedvideo = value;
    34. OnPropertyChanged();
    35. }
    36. }
    37. public MainWindowViewModel()
    38. {
    39. Videos = new ObservableCollection<Video>();
    40. for (int i = 0; i < 20; i++)
    41. {
    42. Video v1;
    43. if (i % 2 == 0)
    44. {
    45. v1 = new Video($"id{i}", $"titel1{i}", $"Uploader1{i}", $"kat,ad,asd,qweqw{i}", false, "Images/default.jpg");
    46. }
    47. else
    48. {
    49. v1 = new Video($"id{i}", $"titel1{i}", $"Uploader1{i}", $"kat,ad,asd,qweqw{i}", true, "Images/default.jpg");
    50. }
    51. Videos.Add(v1);
    52. }
    53. }
    54. }
    55. }


    Videoklasse:
    Spoiler anzeigen

    C#-Quellcode

    1. using System;
    2. using System.Collections.ObjectModel;
    3. using System.IO;
    4. using System.Net.Http;
    5. namespace xCrawler.Klassen
    6. {
    7. public class Video : BaseModel
    8. {
    9. public Video()
    10. {
    11. }
    12. public Video(string videoId, string titel, string uploader, string kategorien, bool status, string imagesource)
    13. {
    14. this.VideoId = videoId;
    15. this.Titel = titel;
    16. this.Uploader = uploader;
    17. this.Kategorien = kategorien;
    18. this.Status = status;
    19. this.Image = imagesource;
    20. this.DateAdded = DateTime.Now;
    21. }
    22. private string _imageUrl;
    23. public string Image
    24. {
    25. get { return _imageUrl; }
    26. set
    27. {
    28. if (Equals(value, _imageUrl)) return;
    29. _imageUrl = value;
    30. OnPropertyChanged();
    31. }
    32. }
    33. private DateTime _createDate;
    34. public DateTime DateAdded
    35. {
    36. get { return _createDate; }
    37. set
    38. {
    39. if (Equals(value, _createDate)) return;
    40. _createDate = value;
    41. OnPropertyChanged();
    42. }
    43. }
    44. private string _videoId;
    45. public string VideoId
    46. {
    47. get { return _videoId; }
    48. set
    49. {
    50. if (Equals(value, _videoId)) return;
    51. _videoId = value;
    52. OnPropertyChanged();
    53. }
    54. }
    55. private string _uploader;
    56. public string Uploader
    57. {
    58. get { return _uploader; }
    59. set
    60. {
    61. if (Equals(value, _uploader)) return;
    62. _uploader = value;
    63. OnPropertyChanged();
    64. }
    65. }
    66. private string _kategorien;
    67. public string Kategorien
    68. {
    69. get { return _kategorien; }
    70. set
    71. {
    72. if (Equals(value, _kategorien)) return;
    73. _kategorien = value;
    74. OnPropertyChanged();
    75. }
    76. }
    77. private bool _status;
    78. public bool Status
    79. {
    80. get { return _status; }
    81. set
    82. {
    83. if (Equals(value, _status)) return;
    84. _status = value;
    85. OnPropertyChanged();
    86. }
    87. }
    88. private string _titel;
    89. public string Titel
    90. {
    91. get { return _titel; }
    92. set
    93. {
    94. if (Equals(value, _titel)) return;
    95. _titel = value;
    96. OnPropertyChanged();
    97. }
    98. }
    99. }
    100. }​


    Das MainWindow CodeBehind hat dann den Code für die Culture Änderung:

    C#-Quellcode

    1. ​using System.Diagnostics;
    2. using System.Globalization;
    3. using System.Threading;
    4. using System.Windows;
    5. using System.Windows.Markup;
    6. using xCrawler.Klassen;
    7. namespace xCrawler
    8. {
    9. public partial class MainWindow : Window
    10. {
    11. public MainWindow()
    12. {
    13. InitializeComponent();
    14. Debug.WriteLine($"{CultureInfo.CurrentCulture}");
    15. CultureInfo currentCulture = new CultureInfo("de-DE");//CultureInfo.CurrentCulture;
    16. Thread.CurrentThread.CurrentCulture = currentCulture;
    17. Thread.CurrentThread.CurrentUICulture = currentCulture;
    18. LanguageProperty.OverrideMetadata(typeof(FrameworkElement), new FrameworkPropertyMetadata(XmlLanguage.GetLanguage(CultureInfo.CurrentCulture.IetfLanguageTag)));
    19. Debug.WriteLine($"{CultureInfo.CurrentCulture}");
    20. }
    21. }
    22. }


    Das Datum Format bleibt wie gehabt beim Englischen.... Verstehe nicht warum.


    Hat jemand eine Idee?
    Grüße , xChRoNiKx

    Nützliche Links:
    Visual Studio Empfohlene Einstellungen | Try-Catch heißes Eisen
    ich mach das im App.xaml.cs - Konstruktor - sry - grad nur in vb:

    VB.NET-Quellcode

    1. Class Application
    2. ' Ereignisse auf Anwendungsebene wie Startup, Exit und DispatcherUnhandledException
    3. ' können in dieser Datei verarbeitet werden.
    4. Public Sub New()
    5. 'Bindungssystem auf lokale Kultur stellen
    6. FrameworkElement.LanguageProperty.OverrideMetadata(GetType(FrameworkElement), New FrameworkPropertyMetadata(System.Windows.Markup.XmlLanguage.GetLanguage(System.Threading.Thread.CurrentThread.CurrentCulture.IetfLanguageTag)))
    7. End Sub
    8. End Class
    (Aber lange nicht mehr mit gearbeitet)
    Hi,

    danke für die Antwort leider bringt auch das nichts.
    Packe ich das ganze in den App.xaml.cs Konstruktor passiert auch nichts.
    Die Datumse bleiben im Englischen Format.

    Keine Fehlermeldung und nichts. Die Culture scheint aber geändert sein. Wenn ich die Debug ausgaben checke wie die CultureInfo lautet steht da de-DE drin.
    Aber keine Ahnung warum da das Datum falsch steht X(
    Grüße , xChRoNiKx

    Nützliche Links:
    Visual Studio Empfohlene Einstellungen | Try-Catch heißes Eisen
    @xChRoNiKx Warum ist überhaupt alles im englischen Format? Ich musste neulich (Post 17) lernen, dass bereits alles auf Deutsch ist und war darüber total erstaunt, weil ich immer dachte, wird wegen dem amerikanischen Visual Studio alles auf Englisch sein... Zumindest hätte ich schwören können, dass ich beim Debuggen auch sowas wie 9/13/2020 gesehen habe, bis jedoch im Format 13/9/2020 ins Label geschrieben wurde.


    Du kannst die Assemblysprache auf Deutsch stellen, vielleicht hat's damit 'was zu tun.
    Bilder
    • Assembly png.png

      250,9 kB, 1.078×618, 94 mal angesehen
    Use “real” CultureInfo.CurrentCulture in WPF Binding, not CultureInfo from IetfLanguageTag

    Anscheint muss du eine eigenen Binding Klasse erstellen???:

    C#-Quellcode

    1. ​using System;
    2. using System.Globalization;
    3. using System.Windows.Data;
    4. namespace MyWpfLibrary
    5. {
    6. public class CultureAwareBinding : Binding
    7. {
    8. public CultureAwareBinding()
    9. {
    10. ConverterCulture = CultureInfo.CurrentCulture;
    11. }
    12. }
    13. }

    Merkwürdig.
    Guten Morgen

    Ich kann den "Fehler" leider nicht nachvollziehen. Bei mir tuts - auch in C#.

    Haste evtl. woanders noch was definiert? Evtl. im XAML?

    Grüße
    Sascha
    Bilder
    • Anmerkung 2020-09-14 075322.png

      67,98 kB, 1.474×553, 92 mal angesehen
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##

    is allerdings mit VB,
    die Sprache über Combo wählen, dein Format wie das Datum aussehen soll musst du einstellen

    VB.NET-Quellcode

    1. Option Strict On
    2. Imports System.Threading
    3. Imports System.Globalization
    4. Imports System.Globalization.CultureInfo
    5. Public Class Form8
    6. Private Sub Form8_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
    7. ComboBox1.DataSource = Globalization.CultureInfo.GetCultures(Globalization.CultureTypes.SpecificCultures).Select(Function(ci) ci.Name).ToList
    8. ComboBox1.SelectedIndex = 6 'für de-DE
    9. End Sub
    10. Private Sub ComboBox1_SelectedIndexChanged(sender As System.Object, e As System.EventArgs) Handles ComboBox1.SelectedIndexChanged
    11. If ComboBox1.SelectedIndex < 0 Then Exit Sub
    12. ' Kulturname, z.B.: "en-US"
    13. Dim sCulture As String = ComboBox1.SelectedItem.ToString.Substring(0, 5)
    14. ' CultureInfo-Objekt erstellen
    15. Dim oCulture As New System.Globalization.CultureInfo(sCulture)
    16. ' DateTimeInfo-Objekt abrufen
    17. Dim oFormatInfo As System.Globalization.DateTimeFormatInfo = oCulture.DateTimeFormat
    18. 'Datum für die verwendete Sprache anzeigen,
    19. 'welches Format musst du einstellen
    20. Label1.Text = oFormatInfo.GetDayName(Now.DayOfWeek) & ", " & _
    21. Now.Day.ToString & ". " & _
    22. oFormatInfo.GetMonthName(Now.Month) & " " & Now.Year.ToString
    23. End Sub
    24. End Class


    hier noch ein Bild
    Hallo
    Erstens ist das nicht WPF und zweitens nicht Binding.
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##

    Hi,

    uff danke für die ganzen Antworten.
    Ich habe nirgendswo anders irgendwas gesetzt an Sprache oder sowas.
    Den Vorschlag von @Bluespide hab ich noch nicht getestet jetzt werde ich aber noch machen.

    Im Anhang das bereinigte Projekt. Läuft so und macht genau nicht das was es soll.

    .NET Framework Version ist 4.8.
    Dateien
    • projekt.rar

      (16,41 kB, 53 mal heruntergeladen, zuletzt: )
    Grüße , xChRoNiKx

    Nützliche Links:
    Visual Studio Empfohlene Einstellungen | Try-Catch heißes Eisen
    Hallo

    Kann es sein das da die RelayCommand Klasse fehlt??

    Grüße
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##

    Hallo

    Ja, sorry. das File war da, aber nicht im Projekt eingebunden. Nun läuft es.

    Habe nun auch den "Fehler" gefunden. Ist (zugegeben) echt eine Blöde Siutation und der Fehler liegt hier im detail.

    Du/ich/wir setzen ja die UI culture für alle Frameworkelemente auf de-DE.

    C#-Quellcode

    1. FrameworkElement.LanguageProperty.OverrideMetadata(typeof(FrameworkElement), new FrameworkPropertyMetadata(XmlLanguage.GetLanguage(CultureInfo.CurrentCulture.IetfLanguageTag)));


    Tja, wenn man sich RUN aber näher ansieht, bemerkt man das es kein FrameworkElement ist.

    Zwei möglicheiten. Explizit auch für run setzen:

    C#-Quellcode

    1. FrameworkElement.LanguageProperty.OverrideMetadata(typeof(Run), new FrameworkPropertyMetadata(
    2. XmlLanguage.GetLanguage(CultureInfo.CurrentCulture.IetfLanguageTag)));

    Erfordert den Import von System.Windows.Documents

    ODER

    Das Language-Tag explizit setzen:

    XML-Quellcode

    1. <Run Text="{Binding DateAdded}" Language="de-DE"/>


    Grüße
    Sascha
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##

    Aha okey da liegt also der Fehler im Detail.
    Dort überhaupt zu suchen wäre mir gar nicht in den Sinn gekommen.

    Habs mal kopiert die Zeile und eingefügt und läuft. Danke dafür.

    Language-Tag explizit setzen ist ja dann "fest" so würde ja dann wenn ein User das nun auf en-US System öffnet trotzdem de-DE anzeigen.
    Ich möchte ja gerne die Culture dann vom System nehmen und anzeigen daher über den Code dann.
    Grüße , xChRoNiKx

    Nützliche Links:
    Visual Studio Empfohlene Einstellungen | Try-Catch heißes Eisen