I have a problem with WPF. I need WPF only for changing font size. So, I want to make something like text editor but only with changing the Font Size. I need to have text box/ text block and a button ("Font Size") which when you click it opens a new textbox and you add the desire size of the text. After you add the number it binds it and applies it to the text.
I can not write the code and will be very grateful if someone helps me! Thanks in advance!
You can use the following :
Style TargetType="{x:Type Window}">
<Setter Property="FontSize" Value="15" />
/Style>
and then add the dynamic change :
Say, textbox1 is the textbox where you want to add size value..
TextBlock FontFamily="Arial" Text="Sample text" FontSize="{Binding TextSize}" />
or
Application.Current.MainWindow.FontSize = Textbox1.text.toInt32();
Related
In a Windows Phone 8.1 WinRT app using c# in Microsoft Visual Studio, with the following code, how can I change the font size of the grid's children text blocks dynamically in the code behind?
<Grid Name="mainGrid">
<Grid.Resources>
<Style TargetType="TextBlock">
<Setter Property="Margin" Value="5"/>
<Setter Property="FontSize" Value="12"/>
</Style>
</Grid.Resources>
</Grid>
The idea is to let the user change the font size in the options screen, and then save it to local settings, and then change the display to match the font size.
The grid's children text blocks are added dynamically when the app is loaded, and I'm not asking how to load values from ApplicationData.Current.LocalSettings. I'm also aware that the styles and setters don't have any names yet, which could be filled in if needed.
I would like to avoid using a resource dictionary and data bindings if possible.
Can someone provide a simple code example to use in the code behind to change the font size?
Here is the way I used to change the style dynamically, but the resource dictionary would be involved.
private void changeSzie_Click(object sender, RoutedEventArgs e)
{
var dynamicStyle = new Windows.UI.Xaml.Style();
var targetType = typeof(Windows.UI.Xaml.Controls.TextBlock);
dynamicStyle.TargetType = targetType;
dynamicStyle.Setters.Add(new Setter(Windows.UI.Xaml.Controls.TextBlock.FontSizeProperty, int.Parse(textbox.Text)));
if (mainGrid.Resources.Keys.Contains(targetType))
{
mainGrid.Resources.Remove(targetType);
}
mainGrid.Resources.Add(targetType, dynamicStyle);
}
To get a common look & feel in my application, I defined a global style for all my TextBlock elements like that:
MainSkin.xaml
<Style TargetType="{x:Type TextBlock}">
<Setter Property="Margin" Value="5,0,5,0"/>
</Style>
Unfortunately this messes up a chart element (from external visifire library) I use and clippes some of the text elements (marked with red rectangle in screenshot):
View.xaml
xmlns:vc="clr-namespace:Visifire.Charts;assembly=WPFVisifire.Charts"
<vc:Chart>
<vc:Chart.Titles>
<vc:Title Text="SomeTitle" />
</vc:Chart.Titles>
<vc:Chart.AxesX>
<vc:Axis Title="X" TitleFontSize="12" />
</vc:Chart.AxesX>
<vc:Chart.AxesY>
<vc:Axis Title="Y" TitleFontSize="12"/>
</vc:Chart.AxesY>
</vc:Chart>
From testing I know the Margin setting of the TextBlock style is causing this. I guess somewhere inside the Chart element, they use a TextBlock that my style affects.
How can I tell the Chart element and its childs in Xaml to ignore the global TextBlock style?
I tried setting the Chart style to null, without success.
Caveats:
I don't want to edit external source code used in the Chart
I don't want to use a x:Key with my style
Just create another TextBlock implicit style that doesn't set anything:
<vc:Chart>
<vc:Chart.Resources>
<Style TargetType="TextBlock" />
</vc:Chart.Resources>
<vc:Chart.Titles>
<vc:Title Text="SomeTitle" />
</vc:Chart.Titles>
<vc:Chart.AxesX>
<vc:Axis Title="X" TitleFontSize="12" />
</vc:Chart.AxesX>
<vc:Chart.AxesY>
<vc:Axis Title="Y" TitleFontSize="12"/>
</vc:Chart.AxesY>
</vc:Chart>
How do I increase border thickness for RadMaskedInputBaseStyle (or RadMaskedDateTimeInput by Telerik) in Silverlight only WHEN it is red indicating that the input contains invalid entry.
My XAML looks like this
<Style TargetType="telerik:RadMaskedDateTimeInput">
<Setter Property="IsValidationHintVisible" Value="True" />
</Style>
In general, if a style isn't available as a property of the control, then you will find it buried somewhere in the control template (as Chris W alludes to in the comments).
To see the source for a proprietary control template like one of Telerik's, open up Expression Blend and click "Edit Template" on an instance of the control. If you do that for the RadMaskedDateTimeInput, you will notice the validation-related visual states making reference to an element named "ErrorElement". Scroll down, in the control template source, and you will see that is declared as follows:
<Telerik_Windows_Controls_Chromes:ValidationTooltip x:Name="ErrorElement" Opacity="0" TooltipPlacementTarget="{Binding RelativeSource={RelativeSource TemplatedParent}}" telerik:StyleManager.Theme="{StaticResource Theme6}" TooltipContent="{TemplateBinding DisplayErrorMessage}" TooltipContentTemplate="{TemplateBinding ErrorMessageTemplate}" />
Ok, so it's another control called ValidationTooltip. This control does have a BorderThickness property exposed, so if you like, you should be able to simply set that property in a targeted global style. Something like this should go in your resource dictionary:
<Style xmlns:Telerik_Windows_Controls_Chromes="clr-namespace:Telerik.Windows.Controls.Chromes;assembly=Telerik.Windows.Controls"
TargetType="Telerik_Windows_Controls_Chromes:ValidationTooltip">
<Setter Property="BorderThickness" Value="2" />
</Style>
Is it possible in a Silverlight Datagrid to manually define where the line break should be? (instead of automatically wrapping to the next line when the border is reached)
This seems like to be the code (source):
<sdk:DataGridTextColumn
Header="Address"
Width="150"
Binding="{Binding Address}" >
<sdk:DataGridTextColumn.ElementStyle>
<Style TargetType="TextBlock">
<Setter Property="TextWrapping" Value="Wrap"/>
</Style>
</sdk:DataGridTextColumn.ElementStyle>
</sdk:DataGridTextColumn>
But how do i manually make the line break?
It is possible in common WPF controls so I believe it should be possible on Silverlight as well. Basically what you need is to target the TextBlock control on each cell of the column, similarly to what is being done to give it a text wrapping style.
As you don't clarify from your question wheter you want to assign the text programmatically or on the XAML, I am going to give you a hint on how to do both.
You can assign the text programmatically using an approach similar to this answer:
txtBlock.Inlines.Add("This is the first paragraph");
txtBlock.Inlines.Add(new LineBreak());
txtBlock.Inlines.Add("This is the second paragraph");
On the other hand, if you want to assign the text directly on XAML, you can use the <LineBreak/> tag directly inside your text, as mentioned in this answer:
<TextBlock>
This is the first paragraph <LineBreak/>
This is the second paragraph
</TextBlock>
I'm writing an application in WPF using the MVVM-pattern and will really often use TextBoxes.
I don't want to use labels for the user to know user what the text box is for, i.e. I don't want something like this:
<TextBlock> Name: </TextBlock>
<TextBox />
Instead, I would like the TextBox to contain its own label. Statically, you would express it like this:
<TextBox>Name</TextBox>
If the cursor is displayed in the textbox, i.e. the TextBox gains focus, I want the description text to disappear. If the TextBox is left empty and it loses the focus, the description text should be shown again. It's similar to the search textbox of StackOverflow or the one of Firefox. (please tell me if your not sure what I mean).
One TextBox's label may change at runtime, dependending on e.g. a ComboBox's selected element or a value in my ViewModel. (It's like in Firefox's search TextBox, if you select google from the search engins' menu, the TextBox's label changes to "Google", if you select "Yahoo" its set to "Yahoo"). Thus I want to be able to bind the label's content.
Consider that I may already have a Binding on the Text-Property of the TextBox.
How can implement such a behaviour and make it reusable for any of my TextBox's? Code is welcome but not needed; a description of what to do is enough.
Thank you in advance.
Here is a style I think is exactly what you are looking for, and it's pure XAML.
<Style x:Key="WatermarkTextBox" TargetType="{x:Type TextBox}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type TextBox}">
<Grid>
<Border x:Name="BorderBase" Background="White" BorderThickness="1.4,1.4,1,1" BorderBrush="Silver">
<Label x:Name="TextPrompt"
Content="{Binding RelativeSource={RelativeSource Mode=TemplatedParent}, Path=Tag}"
Background="{TemplateBinding Background}" Visibility="Collapsed"
Focusable="False" Foreground="Silver"/>
</Border>
<ScrollViewer Margin="0" x:Name="PART_ContentHost" Foreground="Black"/>
</Grid>
<ControlTemplate.Triggers>
<MultiTrigger>
<MultiTrigger.Conditions>
<Condition Property="IsFocused" Value="False"/>
<Condition Property="Text" Value=""/>
</MultiTrigger.Conditions>
<Setter Property="Visibility" TargetName="TextPrompt" Value="Visible"/>
</MultiTrigger>
<Trigger Property="IsFocused" Value="True">
<Setter Property="BorderBrush" TargetName="BorderBase" Value="Black"/>
</Trigger>
<Trigger Property="IsEnabled" Value="False">
<Setter Property="Foreground" Value="DimGray" />
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
Usage is:
<TextBox Style="{StaticResource WatermarkTextBox}" Tag="Full Name"/>
where Tag is the help message you want to show.
You could clean up this style for your own use, but the most important part is the which controls hiding/showing the helper text.
It's worth noting as well, there is already a DependencyObject available for storing the helper text, so you don't need to create your own with this method.
FrameworkElement.Tag is available for holding arbitrary information about this element. That's why we set the Tag property:
http://msdn.microsoft.com/en-us/library/system.windows.frameworkelement.tag.aspx
You could derive from TextBox and implement your behaviour. The TextBox offers the events GotFocus/LostFocus (or the methods OnGotFocus/OnLostFocus respectively) which should help. You also should consider offering a new DepedencyProperty, so you can define the default text in xaml and bind it to other controls/resources etc.
To amplify on my suggestion about using an adorner.
An Adorner is basically an element, rendered on its own layer, that appears over/around another element. For instance, if you implement validation in a binding, the red box that decorates an invalid control is an adorner - it's not part of the control, and it can be (and is) applied to all kinds of controls. See the Adorners section of the WPF docs for a simple but clear example.
I thought of an Adorner for a couple of reasons. The principal one is that the behavior you're describing might not necessarily be confined to a TextBox. You might, for instance, want to have a ComboBox exhibit the same behavior. Implementing an Adorner would give you a consistent way to implement this functionality across multiple controls (though it doesn't make sense in, say, a CheckBox or a ProgressBar). A second is that you wouldn't have to do anything to the underlying control more elaborate than implementing triggers to display and hide the Adorner in response to focus events. Adorners are a bit of a pain in the butt to implement, but it's worth knowing how to.
All that said, I like mattjf's answer a lot more than I like mine. The only disadvantages I see with that approach are 1) It only works with the TextBox; you need to implemnent a new version of the style every time you want to use the approach on another control, 2) I may just be engaging in magical thinking, but every time I ever used the Tag property in WinForms it told me (once I learned to listen) that I was building something fragile. I don't know for sure that this is also true in WPF, but I bet it is.
My comment on using the bound Text property probably needs amplification. If you use the Text property to store the field label, then you've got a number of hard-to-solve problems. First, since it's a bound property, changing its value in the TextBox will change it in the source. So now your source needs to know a lot of information about the state of the UI - does the control currently have the focus? If the value of the Text property is Foo, does that mean that the label is Foo, or the user typed in Foo? There are probably ways that you can manage this, but the best way to manage it is to not have to.
(One other problem with this paradigm: What should be the behavior be if the user wants the value of the TextBox to be the empty string?)