【问题标题】:WPF Custom Control Creation.?WPF 自定义控件创建。?
【发布时间】:2012-05-25 20:18:53
【问题描述】:

我现在正在使用 WPF 应用程序,我必须为 DateTime Picker 编写自己的自定义控件。 日期时间选择器没有任何设置用户定义日期格式的规定。

这样做的方法是什么..如果有人有任何想法请帮助我。

谢谢 阿里吉特。


用户定义格式意味着.. 在我的 senarion 中,我有一个配置文件,并且我有 n 个轴,其中将显示日期时间,并且我有一个下拉列表,它将以配置文件中配置的格式显示当前日期。现在对于每个轴,格式为配置文件可能不同,在这个场景中,我希望日期选择器应该填充当前选择的轴格式。

现在的问题是我已经尝试过@Sebastian Edelmeier 已经指出的以下方法,但是

CultureInfo ci = new CultureInfo(Thread.CurrentThread.CurrentCulture.Name);
ci.DateTimeFormat.ShortDatePattern = "dd/MM/yyyy";
ci.DateTimeFormat.DateSeparator = "/";
Thread.CurrentThread.CurrentCulture = ci; 

因为我将更改应用程序的文化 更改下拉菜单,这种方式是不可接受的。此外,控件是一个对话框,一旦当前线程更新,我猜它不会恢复到另一种文化。

我完全卡在时间点上。

【问题讨论】:

  • “用户定义的日期格式”是什么意思?日期时间的显示格式?我想这可以使用自定义控件模板和现有的 DateTime 选择器添加例如输出文本块的转换器。
  • Joachim 能否请您给我看一个可以解决我的问题的控制模板的代码。请...!

标签: c# wpf custom-controls dependency-properties


【解决方案1】:

也许您可以在绑定中使用 StringFormat 参数覆盖 DatePickerTextBox 的 ControlTemplate。例如

<Style TargetType="{x:Type DatePickerTextBox}">
   <Setter Property="Control.Template">
       <Setter.Value>
          <ControlTemplate>
              <TextBox x:Name="PART_TextBox" 
                   Text="{Binding Path=SelectedDate, RelativeSource={RelativeSource AncestorType={x:Type DatePicker}}, StringFormat=\{0:f\}}" />
              </ControlTemplate>
       </Setter.Value>
   </Setter>
</Style>

其中 {0:f} 是所需的字符串格式。或者,您可以使用自定义转换器来获得所需的格式。 我想这可能就足够了,所以您不必覆盖整个日期选择器的控制模板

【讨论】:

    【解决方案2】:

    如果您想要所有功能并且只更改日期的描述方式,您可以编辑您的 CultureInfo :

     CultureInfo ci = new CultureInfo(Thread.CurrentThread.CurrentCulture.Name);
     ci.DateTimeFormat.ShortDatePattern = "dd/MM/yyyy";
     ci.DateTimeFormat.DateSeparator = "/";
     Thread.CurrentThread.CurrentCulture = ci;
    

    这应该可以解决问题。

    【讨论】:

    • 当一个简单的 ValueConverter 可以解决问题时,这似乎非常具有侵略性。
    • 请先生,告诉我们 ValueConverter 是如何做到的......他不想将日期转换为字符串或以不同的方式对待它,而只是改变它的描述方式控制...
    • @ jjrdk 和 @SebastianEdelmeier 我不想使用字符串转换方法,因为我在我的应用程序中进行了本地化并且更改了位置,否则我们会发现不同的时间格式会创建很多我已经面临的问题。感谢您。阿里吉特
    • 您甚至不必更改 Thread 的文化,它可以像上面提到的那样创建一个区域设置并将其分配给相关控件...
    • 如果您使用默认的 DateTime.Parse 和 DateTime.ToShortDateString,则 ValueConverter 可以工作。然后它也是文化独立的
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-15
    • 1970-01-01
    相关资源
    最近更新 更多