【问题标题】:Concat content of ContentPresenterContentPresenter的concat内容
【发布时间】:2013-08-20 14:33:10
【问题描述】:

尝试在progressBar 中设置文本,我正在正确使用Setters。但我必须将此值与:

{TemplateBinding Value}+"% Completed 

如何与其他文本连接。

在进度条内打印文本的代码:

 <Border x:Name="whiteBorder" >
       <ContentPresenter   x:Name="perHolder" Content="{TemplateBinding Value}" VerticalAlignment="Center" HorizontalAlignment="Right"/>
 </Border>

Silverlight 3.0 版

【问题讨论】:

    标签: c# .net silverlight xaml silverlight-3.0


    【解决方案1】:

    另一种选择是使用inline elements,例如运行:

    <TextBlock>
       <Run Text="{TemplateBinding Value}"/>
       <Run Text="% Completed "/>
    </TextBlock>
    

    编辑:

    看了你的例子后,我认为你不应该在你的模板中使用内容展示器。内容展示器用于可以托管内容的控件(阅读:具有 content 属性)。内容展示器,当给定一个字符串作为内容时,肯定会显示该字符串,您可以使用它,但对于字符串,您最好的选择是 textblock。它还使 oyu 可以更好地控制字符串的显示方式。

    还有,我的错。 TemplateBinding 对可用的地方很挑剔,内联元素不在他的列表中。您最好的选择就像 Cris W. 所说,使用 stackpanel:

    <Border x:Name="whiteBorder" >
         <StackPanel Orientation="Horizontal" VerticalAlignment="Center" HorizontalAlignment="Right">
            <TextBlock Text="{TemplateBinding Value}"/>
            <TextBlock Text="% Completed"/>
         </StackPanel>/>
    </Border>
    

    【讨论】:

    • 我只是想把这个添加到我的答案中,后来我想了一下,哈哈比我早了 50 分钟,+1
    • 嗨,我完成了 %,但没有 TemplateBinding 值。如果我使用 contentpresenter,我可以得到 ..你能检查一下需要更改的内容或告诉我如何确保它在此工作链接..dropbox.com/s/2nro23mm0oecknk/Progress%20Bar.zip
    • 如果您打算使用 ContentPresenter,只需单独组合对象,例如 跨度>
    【解决方案2】:

    或者...您也可以只使用StringFormat

    <ContentPresenter x:Name="perHolder" 
           Content="{TemplateBinding Value, StringFormat='\{\0}&#37; Completed'}" 
           VerticalAlignment="Center" HorizontalAlignment="Right"/>
    

    希望这会有所帮助...

    【讨论】:

    • 这看起来很棒,我试了一下,但没有用。请查看我制作的示例链接。dropbox.com/s/2nro23mm0oecknk/Progress%20Bar.zip 请更新。
    • silverlight 3.0 版
    • 啊废话,我没有看到 version3 部分。这似乎不支持 StringFormat 这使得 @sircodesalot 的答案是正确的。
    【解决方案3】:

    要增加值,请使用实现IValueConverter 的类,如下所述:

    http://msdn.microsoft.com/en-us/library/system.windows.data.ivalueconverter.aspx

    实质上,实现IValueConverter 的类将在名为Convert 的方法中拦截value。您从此方法返回的值是您真正想要显示的值。考虑:

    命名空间 Sharp {

        public class MyConverter : IValueConverter {
            public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) {
                // First cast the value to an 'int'.
                Int32 theInputtedValue = (Int32)value;
    
                // Then return the newly formatted string.
                return String.Format("{0}% Completed", theInputtedValue);
            }
    
            public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) {
                throw new NotImplementedException();
            }
        }
    

    }

    请注意,在上面的示例中,值转换器位于命名空间 Sharp 中。现在我们将其添加到 XAML 定义中:

    <Window x:Class="Sharp.MyWindow"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
    
             xmlns:lol="clr-namespace:Sharp">
    

    最后一行是我们的值转换器所在的命名空间(也就是说,lol 现在将指向 Sharp CLR 命名空间。

    接下来我们将这个类添加到我们的Window 资源中:

    <Window.Resources>
        <lol:MyConverter x:Key="TheValueConverter" />
    </Window.Resources>
    

    这会创建一个可以在 XAML 中使用的类的实例。所以,到目前为止,我们的 XAML 看起来像这样:

    <Window x:Class="Sharp.MyWindow"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
    
             xmlns:lol="clr-namespace:Sharp">
    
        <Window.Resources>
            <lol:MyConverter x:Key="TheValueConverter" />
        </Window.Resources>
    

    现在我们只需将其添加到您的内容演示器中,如下所示:

    <ContentPresenter Content="{TemplateBinding Value, Converter={StaticResource TheValueConverter}}" ... />
    

    这告诉ContentPresenter,当它呈现值时,它应该使用TheValueConverter 实例,它是我们ValueConverter 的一个实例。需要注意两点:(1) 确保使用instance 的名称 (TheValueConverter) 而不是 class 的定义 (MyConverter)。 (2) 确保将实例名称包裹在{StaticResource}中。

    【讨论】:

    • 请查看我上传的示例链接。dropbox.com/s/2nro23mm0oecknk/Progress%20Bar.zip 请更新
    猜你喜欢
    • 2020-11-04
    • 1970-01-01
    • 2015-07-04
    • 2023-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多