|
I'm styling a treeview so that when the mouse is over a treeviewitem it appears as a gradient bar. I'm trying to get the same effect as the VS2010 menu bars, except in a gold-ish gradient:
<UserControl.Resources>
<HierarchicalDataTemplate DataType="{x:Type local:TreeNode}"
ItemsSource="{Binding Path=Nodes}">
<Border BorderBrush="#E5C365" BorderThickness="1" CornerRadius="5">
<StackPanel Orientation="Horizontal"
Margin="10,0,0,10">
<TextBlock Text="{Binding Path=Caption}" Height="25"></TextBlock>
</StackPanel>
</Border>
</HierarchicalDataTemplate>
<LinearGradientBrush x:Key="TreeItemMouseOverStyle" StartPoint="0.5,0" EndPoint="0.5,1">
<GradientStop Color="#FFFFFF" Offset="0.0" />
<GradientStop Color="#FFF3CF" Offset="0.25" />
<GradientStop Color="#FFECB5" Offset="0.75" />
<GradientStop Color="#FFECB5" Offset="1.0" />
</LinearGradientBrush>
<Style TargetType="TreeViewItem">
<Setter Property="IsExpanded" Value="True" />
<Style.Triggers>
<Trigger Property="IsMouseOver" Value="True">
<Setter Property="Background" Value="{StaticResource TreeItemMouseOverStyle}"/>
</Trigger>
</Style.Triggers>
</Style>
</UserControl.Resources>
The problem is, I don't want the border to be visible unless the mouse is over the item. How do I do this?
Everything makes sense in someone's mind
|
|
|
|
|
I would probably try setting a custom style for the Border component - create the new style, set the trigger in the custom style, and set the border's style to the new custom border style.
.45 ACP - because shooting twice is just silly ----- "Why don't you tie a kerosene-soaked rag around your ankles so the ants won't climb up and eat your candy ass..." - Dale Earnhardt, 1997 ----- "The staggering layers of obscenity in your statement make it a work of art on so many levels." - J. Jystad, 2001
|
|
|
|
|
Ok, I understand but I'm not quite sure how to. Do you have an example?
Everything makes sense in someone's mind
|
|
|
|
|
Easy.
1) set the initial BorderBrush to Transparent
2) add a MouseOver trigger to the border where you set it to #E5C365
Something like this:
<Border BorderBrush="Silver" BorderThickness="1" Height="43" HorizontalAlignment="Left" Margin="34,202,0,0" Name="border1" VerticalAlignment="Top" Width="99">
<Border.Style>
<Style>
<Style.Triggers>
<Trigger Property="Border.IsMouseOver" Value="True">
<Setter Property="Border.Background" Value="Red" />
</Trigger>
</Style.Triggers>
</Style>
</Border.Style>
</Border>
-- Modified Monday, November 15, 2010 3:20 PM
|
|
|
|
|
Well, I thought what you wrote was easy too. Except I coded it and I see no change:
<UserControl.Resources>
<HierarchicalDataTemplate DataType="{x:Type local:TreeNode}"
ItemsSource="{Binding Path=Nodes}">
<Border BorderBrush="Transparent"
BorderThickness="1"
CornerRadius="2">
<Border.Style>
<Style>
<Style.Triggers>
<Trigger Property="Border.IsMouseOver" Value="True">
<Setter Property="Border.BorderBrush" Value="Red" />
<Setter Property="Border.BorderThickness" Value="3" />
</Trigger>
</Style.Triggers>
</Style>
</Border.Style>
<StackPanel Orientation="Horizontal"
Margin="5,2,5,2">
<TextBlock Name="txtProject"
Text="{Binding Path=Caption}"
FontSize="12"
Foreground="#024991">
<TextBlock.ToolTip>
<StackPanel>
<TextBlock FontWeight="Bold" Text="{Binding Path=Caption}"/>
<TextBlock Text="{Binding Path=FileName}"/>
</StackPanel>
</TextBlock.ToolTip>
</TextBlock>
</StackPanel>
</Border>
</HierarchicalDataTemplate>
<LinearGradientBrush x:Key="TreeItemMouseOverStyle" StartPoint="0.5,0" EndPoint="0.5,1">
<GradientStop Color="#FFFFFF" Offset="0.0" />
<GradientStop Color="#FFF3CF" Offset="0.25" />
<GradientStop Color="#FFECB5" Offset="0.75" />
<GradientStop Color="#FFECB5" Offset="1.0" />
</LinearGradientBrush>
<LinearGradientBrush x:Key="TreeItemSelectedStyle" StartPoint="0.5,0" EndPoint="0.5,1">
<GradientStop Color="#DBEAFC" Offset="0.0" />
<GradientStop Color="#D3E5FC" Offset="0.25" />
<GradientStop Color="#C7DFFC" Offset="0.75" />
<GradientStop Color="#C1DCFC" Offset="1.0" />
</LinearGradientBrush>
<Style x:Name="TreeViewItemStyle" TargetType="TreeViewItem">
<Setter Property="IsExpanded" Value="True" />
<Style.Triggers>
<Trigger Property="IsMouseOver" Value="True">
<Setter Property="Background" Value="{StaticResource TreeItemMouseOverStyle}"/>
</Trigger>
<Trigger Property="IsSelected" Value="True">
<Setter Property="Background" Value="{StaticResource TreeItemSelectedStyle}"/>
</Trigger>
</Style.Triggers>
</Style>
</UserControl.Resources>
Everything makes sense in someone's mind
|
|
|
|
|
Is the gradient background showing up correctly? Because your style triggers could be breaking the border triggers (not sure on this, you didn't include your code, so its hard to try). If you remove the two triggers from the bottom of the XAML, does the border one work? Because I did try the border one in VS2010 before I posted it . I've seen different levels of triggers interfere with each other. If removing the two bottom triggers fixes the border trigger, then I'd suggest combining those triggers into the data template.
|
|
|
|
|
The mouseover gradient shows up. The selected item gradient does not. Commenting out the triggers didn't do anything. Here's the code again:
<UserControl.Resources>
<!--TreeViewItem Data Template-->
<HierarchicalDataTemplate DataType="{x:Type local:TreeNode}"
ItemsSource="{Binding Path=Nodes}">
<Border BorderBrush="Transparent"
BorderThickness="1"
CornerRadius="2">
<Border.Style>
<Style>
<Style.Triggers>
<Trigger Property="Border.IsMouseOver" Value="True">
<Setter Property="Border.BorderBrush" Value="Red" />
<Setter Property="Border.BorderThickness" Value="3" />
</Trigger>
</Style.Triggers>
</Style>
</Border.Style>
<StackPanel Orientation="Horizontal"
Margin="5,2,5,2">
<TextBlock Name="txtProject"
Text="{Binding Path=Caption}"
FontSize="12"
Foreground="#024991">
<TextBlock.ToolTip>
<StackPanel>
<TextBlock FontWeight="Bold" Text="{Binding Path=Caption}"/>
<TextBlock Text="{Binding Path=FileName}"/>
</StackPanel>
</TextBlock.ToolTip>
</TextBlock>
</StackPanel>
</Border>
</HierarchicalDataTemplate>
<!--Gradients-->
<LinearGradientBrush x:Key="TreeItemMouseOverStyle" StartPoint="0.5,0" EndPoint="0.5,1">
<GradientStop Color="#FFFFFF" Offset="0.0" />
<GradientStop Color="#FFF3CF" Offset="0.25" />
<GradientStop Color="#FFECB5" Offset="0.75" />
<GradientStop Color="#FFECB5" Offset="1.0" />
</LinearGradientBrush>
<LinearGradientBrush x:Key="TreeItemSelectedStyle" StartPoint="0.5,0" EndPoint="0.5,1">
<GradientStop Color="#DBEAFC" Offset="0.0" />
<GradientStop Color="#D3E5FC" Offset="0.25" />
<GradientStop Color="#C7DFFC" Offset="0.75" />
<GradientStop Color="#C1DCFC" Offset="1.0" />
</LinearGradientBrush>
<!--TreeViewItem Style-->
<Style x:Name="TreeViewItemStyle" TargetType="TreeViewItem">
<Setter Property="IsExpanded" Value="True" />
<Style.Triggers>
<Trigger Property="IsMouseOver" Value="True">
<Setter Property="Background" Value="{StaticResource TreeItemMouseOverStyle}"/>
</Trigger>
<Trigger Property="IsSelected" Value="True">
<Setter Property="Background" Value="{StaticResource TreeItemSelectedStyle}"/>
</Trigger>
</Style.Triggers>
</Style>
</UserControl.Resources>
Everything makes sense in someone's mind
|
|
|
|
|
Oh... duh... sorry, I didn't read your question closely enough . Two things...
1) your TargetType actually needs to be "{x:Type TreeViewItem}"
2) doing the IsSelected thing will actually be a little tricky... if you examine the stock TreeViewItem template, you'll find a template trigger is doing it:
<Trigger Property="IsSelected" Value="true">
<Setter Property="Background" TargetName="Bd" Value="{DynamicResource {x:Static SystemColors.HighlightBrushKey}}"/>
<Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.HighlightTextBrushKey}}"/>
</Trigger>
So, unfortunately, that is "overriding" your trigger because the border "Bd" sits on top of the item. What you did works for IsMouseOver (on non selected items) because Bd is transparent in that case and the TreeViewItem background shows through.
You'd need to replace the entire template for TreeViewItem just to get to that sucker
|
|
|
|
|
One other thing... the TreeViewItem template is different for every OS, so you'd need 4 or 5 versions and a custom template selector... pain in the a$$, I know .
|
|
|
|
|
Hi guys
I have a question for you.
I created a c# class on server side, and i want that to be runned when my application starts.Can i do this??(i know that is possibile creating a WCF service)
But i would like to know if there are another way.
Thanks
Bye
|
|
|
|
|
You mean you have a Class and that has a Function and you want to Run the Function when your app starts ?
yes its possible , instatiate your class and create an object as we normally do and call the function. in here
public MainPage()
{
InitializeComponent();
}
Vuyiswa Maseko,
Spoted in Daniweb-- Sorry to rant. I hate websites. They are just wierd. They don't behave like normal code.
C#/VB.NET/ASP.NET/SQL7/2000/2005/2008
http://www.vuyiswamaseko.com
vuyiswa@its.co.za
http://www.itsabacus.co.za/itsabacus/
|
|
|
|
|
Silverlight is a client side technology.
However, you could use the Aspx page host to execute server side code.
The funniest thing about this particular signature is that by the time you realise it doesn't say anything it's too late to stop reading it.
My latest tip/trick
Visit the Hindi forum here.
|
|
|
|
|
Ok.That's right.
So if i create a class at server-side i can't instantiate that at client-side(for ex. in the MainPage's code behind), am i right??
Infact i tried to that but i couldn't.
You said to use the aspx page, i will try this option too.
Are there a tutorial or guide in this forum which explains the differences beetween server and cliend side.What can i do. and what i can't do.
Bye thanks
|
|
|
|
|
hello
Regarding Mouse Move handler - how to determine span of move (i.e. delta x and delta y)...? Thanks
<br />
private void SomeUserControl_MouseMove(object sender, MouseEventArgs e)<br />
{<br />
Point CurPos = Mouse.GetPosition(_parent);<br />
Point RelPos = _parent.PointToScreen(new Point(0, 0));<br />
<br />
if (IsMoving)<br />
{<br />
if (e.LeftButton == MouseButtonState.Pressed)<br />
{<br />
}<br />
}<br />
return;<br />
}<br />
dev
|
|
|
|
|
Usually you want to start measuring on some event or from some location, so what I do is trap the event that starts the measuring (usually MouseDown in my cases) and save the location. Then in the MouseMove event you can calculate the span by whatever distance metric you want.
CQ de W5ALT
Walt Fair, Jr., P. E.
Comport Computing
Specializing in Technical Engineering Software
|
|
|
|
|
hello
Anybody run across repaint issue with XenApp while minimizing WPF Popup - when popup (not the application) is minimized, it seems it still leaves behind "Ghosting" effect (patch of blue area) blocking application in the back (For example, Excel).
This is not a problem when:
(a) If user minimize the entire application instead of just the popup
(b) When XenApp runs under "Percent of Screen" as supposed to "Seamless" mode
(c) If the user "Close" the popup as supposed to just "Minimize" it (In the back, the popup's size was really/actually reduced in addition to setting it to transparent)
Thanks
dev
|
|
|
|
|
Hi,
Looking for a bit of help regarding a Datatrigger that I'm trying to implement in my mvvm application.
What I have is a grid and in the grids triggers I have a datatrigger that is bound to a boolean property
called ShowAnimation that when true, triggers a animation to go. Code doesnt run at all. I tried setting the
animation off using an eventtrigger and the animation runs but when I try a data trigger, then no luck. Heres the
xaml for the grid and datatrigger.
<Grid x:Name="ShowAppointmentGrid" Height="10" Width="175" >
<Grid.ColumnDefinitions>
<ColumnDefinition Width="auto"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="auto"/>
<RowDefinition Height="auto"/>
<RowDefinition Height="auto"/>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<Label Grid.Column="0" Grid.Row="0" Content="Date :"/>
<TextBox Grid.Column="1" Text="10 - Apr - 2010" />
<Label Grid.Column="0" Grid.Row="1" Content="Location :"/>
<TextBox Grid.Column="1" Grid.Row="1" Text="Liverpool Lils"/>
<Label Grid.Column="0" Grid.Row="2" Content="Time :"/>
<TextBox Grid.Column="1" Grid.Row="2" Text="4:00p.m."/>
<Label Grid.Column="0" Grid.Row="3" Content="Notes :"/>
<TextBox Grid.Column="1" Grid.Row="3" TextWrapping="Wrap" >
<Grid.Triggers>
<DataTrigger Binding="{Binding Path=ShowAnimation}" Value="True">
<DataTrigger.EnterActions>
<BeginStoryboard>
<Storyboard >
<DoubleAnimation Storyboard.TargetName="ShowAppointmentGrid"
Storyboard.TargetProperty="Height"
To="135" Duration="0 :.5"/>
</Storyboard>
</BeginStoryboard>
</DataTrigger.EnterActions>
<DataTrigger.ExitActions>
<BeginStoryboard>
<Storyboard>
<DoubleAnimation Storyboard.TargetName="ShowAppointmentGrid" Storyboard.TargetProperty="Height"
Duration="0 .3"/>
</Storyboard>
</BeginStoryboard>
</DataTrigger.ExitActions>
</DataTrigger>
</Grid.Triggers>
</Grid>
Thanks
|
|
|
|
|
Hi, I have following problem with accordion:
I add item to accordion at runtime with name like:
AccordionItem newItem = new AccordionItem();<br />
newItem.Name = "accordionItem_"+(myAccordion.Items.Count + 1).ToString();
then I remove it and once again I try to add it but I get an error "Value does not fall within the expected range" bacause supposedly an item with that name already exists. However, Items.Count is 0.
Can someone help?
|
|
|
|
|
Why not make the item visible/collapsed instead of trying to destroy/add it.
Never underestimate the power of human stupidity
RAH
|
|
|
|
|
Because I need it to be removed, that is why. Hiding is not an option.
|
|
|
|
|
Simply make sure the item is removed. Can you please post the code here (for removing the item).
In general, the remove method works.
The funniest thing about this particular signature is that by the time you realise it doesn't say anything it's too late to stop reading it.
My latest tip/trick
Visit the Hindi forum here.
|
|
|
|
|
I simply use newAccordion.Items.Remove method. Maybe silverlight is still keeping somewhere the name of this item inside accordion? I made a test and there is no problem with creating i.e. a TextBlock with the same name.
|
|
|
|
|
It seems now that the real problem is the textbox (child of accordion item) that also has the name generated according to accordion.Items.Count. And apparently, when I delete the accordion item this textbox is still somewhere in memory.
Now I don't have time to figure out the proper solution, so I decided to add guid to the name of the textbox and get the accordion.Items.Count value from the name with substring function.
But if anyone could ever find out, how to avoid such problem, please write.
|
|
|
|
|
So I'm coming to the end of phase one and want to set the app up properly. After twattering around with images and the structure of the folders I realised I need to rename 2 of the projects in the application to Admin, the WCF will service both the admin and the public facing site.
I did this with some trepidation (having taken a backup of course)
I now have the following projects
App.WCF
AppAdmin
AppAdmin.Web
My problem is that AppAdmin.web is generating 2 xap files App.xap and AppAdmin.xap and I cannot find out where the old xap file is generated from. This has effectively got rid of the debugging in the AppAdmin project.
Where is the xap generated from.
I also lost the reference to the Assets folder and the styles for some reason. Moving the Styles.xaml to another folder fixed that - weird!
Never underestimate the power of human stupidity
RAH
|
|
|
|
|
Lesson 1 - get your project names right BEFORE you start coding.
I recreated the entire application using the backup files and all works perfectly (within reason anyway).
Now to work out the security between silverlight and the wcf and we are ready for deploy.
Never underestimate the power of human stupidity
RAH
|
|
|
|