|
You haven't set the DataContext for the UserControl :
public Ratings()
{
InitializeComponent();
LayoutRoot.DataContext = this;
}
NB: You'll probably want to set the DataContext on a child of the UserControl , not the UserControl itself; otherwise, you won't be able to bind the properties of the UserControl to the parent DataContext :
http://stackoverflow.com/a/13308966/124386[^]
"These people looked deep within my soul and assigned me a number based on the order in which I joined."
- Homer
|
|
|
|
|
hi men
I have a listView called lw1.
When I use lw1.selectedItem, I can check which item is selected.
But, how I can know which item is alone highlighted by mouse cursor?
note:http://dl.dropbox.com/u/45898865/Immagine.jpg[^]
in picture 1
gimppoi is selected with one click of mouse cursor
in picture 2
gimppoi is selected with one click of mouse cursor
poweooooooooo has alone mouse cursor over the line
good idea
I had tried it yesterday without success.
private void buttonGV_Click(object sender, RoutedEventArgs e)
{
Attivita attivita = null;
for (int i = 0; i < listViewAttivita.Items.Count; i++ )
if ( listViewAttivita.IsMouseOver )
attivita = listViewAttivita.Items[i] as Attivita;
if ( listViewAttivita.IsMouseOver )
this test is needless, because I want know which row is selected. That test told me if the mouse is over one of all ListView rows.
Can you tell me what I should search to understand which row has the mouse over?
this is the XAML part. Does it help?
<ListView ItemsSource= "{Binding AttivitaCollection, UpdateSourceTrigger=PropertyChanged}" Height="206" HorizontalAlignment="Left" Margin="12,33,0,0" Name="listViewAttivita" VerticalAlignment="Top" Width="auto" SelectionChanged="listViewAttivita_SelectionChanged">
<ListView.Resources>
<med:ImageConverter x:Key="imageConverter"/>
</ListView.Resources>
<ListView.View>
<GridView>
<GridViewColumn Header="Azioni registrate" Width="150" DisplayMemberBinding="{Binding nome, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/>
<GridViewColumn Header="Stato" Width="auto" >
<GridViewColumn.CellTemplate>
<DataTemplate>
<Button Width="24" Name="buttonGV" Click="buttonGV_Click" Height="24" Background="Transparent" BorderBrush="Transparent">
<Image Source="{Binding Path=imgStato, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged, Converter={StaticResource imageConverter}}" />
</Button>
</DataTemplate>
</GridViewColumn.CellTemplate>
</GridViewColumn>
</GridView>
</ListView.View>
</ListView>
I already posted this message
http://www.codeproject.com/Messages/4441464/highlight-list-view.aspx[^]
|
|
|
|
|
You're doing it wrong .
1) call the HitTest method to get the UIElement that is under the mouse.
2) chase up the VisualTree til you get a null or a ListViewItem.
|
|
|
|
|
I'm writing a program that construct a huge diagram. Also this diagram can be save to png file. I have no problems when I render my diagram on WPF canvas. The problem start when I trying save it to file. DrawingContext.DrawText stop drawing the text with size==10 when horizontal text position becomes more than 11K pixels!
Here is the code that shows this effect.
I create simple WPF application project and create one class (MainViewControl):
Here is the code for MainViewControl.cs:
class MainViewControl : FrameworkElement
{
public void Draw(DrawingContext context)
{
for (var i = 0; i < Width / 100; i++)
{
var text = new FormattedText((i * 100).ToString(CultureInfo.InvariantCulture), CultureInfo.CurrentCulture, FlowDirection.LeftToRight, new Typeface("Verdana"), 10, Brushes.Blue);
var textPos = new Point((double)i * 100f + 0.789 - text.Width / 2, Height / 2 - text.Height / 2);
context.DrawLine(new Pen(Brushes.Red, 1.0), new Point(i * 100, 0), new Point(i * 100, Height));
context.DrawRectangle(Brushes.White, null, new Rect(textPos.X, textPos.Y, text.Width, text.Height));
context.DrawText(text, textPos);
}
}
protected override void OnRender(DrawingContext context)
{
Draw(context);
}
} Here is the code for MainWindow.xaml:
<Window x:Class="DrawTextProblem.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:DrawTextProblem="clr-namespace:DrawTextProblem"
Title="MainWindow" >
<DockPanel>
<Button Content="Save" Click="ButtonClick" DockPanel.Dock="Top" HorizontalAlignment="Left" />
<ScrollViewer HorizontalScrollBarVisibility="Auto" VerticalScrollBarVisibility="Auto" DockPanel.Dock="Top">
<DrawTextProblem:MainViewControl Width="50000" Height="200" x:Name="mainViewControl" />
</ScrollViewer>
</DockPanel>
</Window>
When click the button I do this:
private void ButtonClick(object sender, RoutedEventArgs e)
{
var dlg = new Microsoft.Win32.SaveFileDialog { FileName = "Image", DefaultExt = ".png", Filter = "Images (.png)|*.png" };
if (dlg.ShowDialog() == true)
{
try
{
var bounds = new Rect(0, 0, mainViewControl.Width, mainViewControl.Height);
var diagramBitmap = new RenderTargetBitmap((int)bounds.Width, (int)bounds.Height, 96d, 96d, PixelFormats.Default);
var drawingVisual = new DrawingVisual();
var context = drawingVisual.RenderOpen();
context.DrawRectangle(Brushes.White, null, bounds);
mainViewControl.Draw(context);
context.Close();
diagramBitmap.Render(drawingVisual);
var imageFile = new FileStream(dlg.FileName, FileMode.Create, FileAccess.Write);
var encoder = new PngBitmapEncoder();
encoder.Frames.Add(BitmapFrame.Create(diagramBitmap));
encoder.Save(imageFile);
imageFile.Flush();
imageFile.Close();
MessageBox.Show("Image successfully saved.", "Image saved", MessageBoxButton.OK, MessageBoxImage.Information);
}
catch (Exception exception)
{
MessageBox.Show(string.Format("Error:\n{0}", exception.Message), string.Empty, MessageBoxButton.OK, MessageBoxImage.Error);
}
}
}
When I start this application I see MainViewControl on the MainWindow with all text labels every 100 pixels. If I click save button, text labels are disappearing in saved image after 11K pixels!
It's the same for text size = 10, 11 or 7, BUT not for 8, 9, 16 etc. Moreover, If I use text size 10.001 it works fine!
Does anybody know about this problem? It's a WPF bug?
|
|
|
|
|
I have the exact same issue! I would appreciate any help
|
|
|
|
|
How do you stop a WebBrowser object in WPF?
The stop method is not an option becasue that is only available in windows forms.
http://msdn.microsoft.com/en-us/library/system.windows.forms.webbrowser.stop.aspx
And Dispose does not seem to be the answer either.
I am not using the webbrowser class for its visible properties to the user. I am using it to navagate several URL's in a row. This can have a wierd effect where the browser starts sending back load completed messages when the body of the html is not usable and I just want it stopped.
|
|
|
|
|
Please do not post the same question more than once. you can edit your original if it needs more detail.
One of these days I'm going to think of a really clever signature.
|
|
|
|
|
How do you stop a WebBrowser object in WPF?
The stop method is not an option becasue that is only available in windows forms.
http://msdn.microsoft.com/en-us/library/system.windows.forms.webbrowser.stop.aspx
And Dispose does not seem to be the answer either.
|
|
|
|
|
If I want to display the word "hello" in a flowdocument I would write:
<paragraph>
<run>hello</run>
</paragraph>
How do I get each letter of the word "hello" to be a different colour?
|
|
|
|
|
Each letter will be in its own Run and you would style them individually.
|
|
|
|
|
Thank's for your reply. Run adds a space so I get "H e l l o"
|
|
|
|
|
Use a Span tag for each character:
<Span Foreground="Red">H</Span><Span Foreground="Orange">e</Span><Span Foreground="Yellow">l</Span><Span Foreground="Green">l</Span><Span Foreground="Blue">o</Span>
|
|
|
|
|
Span adds leading spaces too
|
|
|
|
|
I tested it! ... (in WPF, not Silverlight)
Of course, there can be no spaces between the Span tags (end of one Span and beginning of the next).
Just as I showed in posting above...
|
|
|
|
|
Ah - I just found that out too - it's the same with Run
Thanks for your help
|
|
|
|
|
You were right - but all the Run elements have to be on the same line.
Thanks for your help<
|
|
|
|
|
hi.
I'm trying to insert a stackpanel into a columndefinion programmatically
I do this:
two colored rectangles
stackpanel.Children.Insert(0, rectng);
stackpanel.Children.Insert(1,recText);
ViewerGrid.ColumnDefinitions[index].SetValue(ContentProperty, stackpanel);
i don't receive nothing at the grid. empty at all.
maybe the way i work with the columndefinitios is not the way that should.
thanks.
|
|
|
|
|
The column information is an attached property. I think you want something like:
stackpanel.Children.Insert(0, rectng);
stackpanel.Children.Insert(1,recText);
ViewerGrid.Children.Add(stackpanel);
Grid.SetColumn(stackpanel, index);
|
|
|
|
|
|
hi,I have a grid that background is transparent,
how i can save the image that the grid is display?
|
|
|
|
|
Hello guys,
i have a Treeview with CheckBox and TextBlock, and i wanna know how i can change the backgroundcolor for the textblock and for each parentnode in the tree when the checkbox is checked?!
I have try to set trigger and setter, but i dont have the right solution.
Can anyone please help me?
friendly regards
|
|
|
|
|
I have a window with 2 splitters. Thus makes up a left pane, a tab area, and a right pane. Think Visual Studio
The left splitter works fine, but the right does not. Here's the XAML. Paste into a window and you'll see what I mean. The spliiter is there, just all the way over to the right:
<Window x:Class="FMG.UI.WPF.Views.MainWindowView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Height="350"
Width="525"
Closing="Window_Closing"
Background="LightSkyBlue">
<!--Title="{Binding Source={x:Static classes:FMGEngine.AppLongName}}"-->
<Window.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="..\Resources.xaml"/>
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</Window.Resources>
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
<RowDefinition Height="*"/>
<RowDefinition Height="Auto"/>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="Auto"/>
</Grid.ColumnDefinitions>
<!--Menu-->
<Menu Grid.Row="0"
Grid.Column="0"
Grid.ColumnSpan="5"
IsMainMenu="True">
<MenuItem Header="_File" />
<MenuItem Header="_Edit" />
<MenuItem Header="_View" />
<MenuItem Header="_Window" />
<MenuItem Header="_Help" />
</Menu>
<!--Toolbar-->
<ToolBar Name="tbrStandard"
Grid.Row="1"
Grid.ColumnSpan="5">
<Button>One</Button>
<Button>Two</Button>
<Button>Three</Button>
</ToolBar>
<!--Left Side Grid-->
<Grid Grid.Row="2"
Grid.Column="0"
HorizontalAlignment="Stretch">
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<!--Search Area Grid-->
<Grid Grid.Row="0"
Grid.Column="0"
Width="Auto">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="Auto"/>
</Grid.ColumnDefinitions>
<TextBox Grid.Column="0"
Width="Auto"/>
<Button Grid.Column="1"
Height="24"
Width="24"/>
</Grid>
<ListBox Grid.Row="1"
Grid.Column="0"
Background="Aqua"
HorizontalAlignment="Stretch"
Width="Auto"/>
</Grid>
<!--Left Verticle Splitter-->
<GridSplitter Grid.Row="2"
Grid.Column="1"
Background="Gray"
ResizeDirection="Columns"
HorizontalAlignment="Left"
Width="10"/>
<!--Tabs-->
<TabControl Grid.Row="2"
Grid.Column="2"
Background="Salmon"/>
<!--Right Verticle Splitter-->
<GridSplitter Grid.Row="2"
Grid.Column="2"
ResizeDirection="Columns"
HorizontalAlignment="Right"
Width="10"/>
<!--Right Side-->
<Grid Grid.Row="2"
Grid.Column="4"
HorizontalAlignment="Stretch"
Background="Red">
<Grid.RowDefinitions>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<ListBox Grid.Row="1"
Grid.Column="0"
Background="SteelBlue"
HorizontalAlignment="Stretch"
Width="Auto"/>
</Grid>
<!--Status Bar-->
<StatusBar Grid.Row="3"
Grid.Column="0"
Grid.ColumnSpan="4"
Height="24"/>
</Grid>
</Window>
Anyone see what's wrong?
Thanks
If it's not broken, fix it until it is
|
|
|
|
|
Here's one tough question - I am suspecting Dispatcher deadlock, thus freezing the UI (after I click SaveItems button some number of times).
The following event handler "OnItemsReloaded" is triggered async from another thread ("LoadItems" thread - which holds a lock on an object "ItemsSyncRoot". Another thread ("SaveItems" thread) also competes to lock on to this object.
(So yes, LoadItems thread and SaveItems thread contending for same lock)
Here's the EMPTY Dispatcher.Invoke (Triggered by "LoadItems" thread - a background thread):
<br />
private void OnItemsReloaded(object sender, EventArgs e)<br />
{<br />
SchedulesGrid.Dispatcher.Invoke(<br />
System.Windows.Threading.DispatcherPriority.Normal,<br />
new Action(<br />
delegate()<br />
{<br />
}<br />
));<br />
<br />
return;<br />
}<br />
If I change above from "Invoke" to "BeginInvoke" - UI no longer freeze! Question is why. (Please note for debugging purpose, event handler Dispatcher delegate is empty! [So no lock in Dispatch.Invoke delegate!]
[SAME, UI don't freeze if I put a "return" before "Dispatcher" invoke!?]
I futher attempted to nail down the scope further by:
(a) Attached Visual Studio debugger to the running/freezed UI - then from Intellitrace, "Breakall"- which reveals that execution of a "Background" thread freeze on attempting to lock(ItemsSyncRoot). Since this is a background thread ("SaveItems" thread) which attempted to lock(ItemsSyncRoot) - this does NOT explains why UI freezed!
(b) Windbg - !syncblk,) then !clrstack - which pointed me to the [Dispatcher.Invoke] as stated above! But what's confusing is, I don't see why an "Empty Dispatcher Invoke" can lead to UI freezing up.
Note that from !syncblk Info=64. I used that in !clrstack command (Is this right?)
<br />
0:210> .loadby sos clr <-- This is to load SOS managed code debugger extension (From same dir as CLR)<br />
0:210> !syncblk <-- List locks, note Info=64. Next command uses this thread ID 64 to retrieve CLR stack of thread 64.<br />
Index SyncBlock MonitorHeld Recursion Owning Thread Info SyncBlock Owner<br />
425 11f0d280 3 1 07136b68 1938 64 0279d498 ItemsSyncRoot<br />
-----------------------------<br />
Total 425<br />
CCW 7<br />
RCW 8<br />
ComClassFactory 0<br />
Free 20<br />
<br />
0:210> ~64e!clrstack <-- see what's thread 64 is doing<br />
OS Thread Id: 0x1938 (64)<br />
Child SP IP Call Site<br />
0e44d7e0 77e200fd [HelperMethodFrame_1OBJ: 0e44d7e0] System.Threading.WaitHandle.WaitOneNative(System.Runtime.InteropServices.SafeHandle, UInt32, Boolean, Boolean)<br />
0e44d888 6354b5ef System.Threading.WaitHandle.InternalWaitOne(System.Runtime.InteropServices.SafeHandle, Int64, Boolean, Boolean)*** WARNING: Unable to verify checksum for C:\Windows\assembly\NativeImages_v4.0.30319_32\mscorlib\246f1a5abb686b9dcdf22d3505b08cea\mscorlib.ni.dll<br />
<br />
0e44d8a4 6352b1ee System.Threading.WaitHandle.WaitOne(System.TimeSpan, Boolean)<br />
0e44d8c4 65addfc1 System.Windows.Threading.DispatcherOperation+DispatcherOperationEvent.WaitOne()*** WARNING: Unable to verify checksum for C:\Windows\assembly\NativeImages_v4.0.30319_32\WindowsBase\d17606e813f01376bd0def23726ecc62\WindowsBase.ni.dll<br />
<br />
0e44d8f4 65adda7a System.Windows.Threading.DispatcherOperation.Wait(System.TimeSpan)<br />
0e44d90c 65aee0aa System.Windows.Threading.Dispatcher.InvokeImpl(System.Windows.Threading.DispatcherPriority, System.TimeSpan, System.Delegate, System.Object, Int32)<br />
0e44d954 65cc8d3d System.Windows.Threading.Dispatcher.Invoke(System.Windows.Threading.DispatcherPriority, System.Delegate)<br />
<br />
... [What the hell a empty Dispatcher.Invoke caused UI to freeze up!?]<br />
0e44d970 005763ee ...OnItemsReloaded(System.Object, System.EventArgs)*** WARNING: Unable to verify checksum for ...<br />
...<br />
<br />
0e44e6f8 6354ae5b System.Threading.ThreadHelper.ThreadStart_Context(System.Object)<br />
0e44e708 634d7ff4 System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object, Boolean)<br />
0e44e72c 634d7f34 System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object)<br />
0e44e748 6354ade8 System.Threading.ThreadHelper.ThreadStart()<br />
0e44e96c 671c21db [GCFrame: 0e44e96c] <br />
0e44ec30 671c21db [DebuggerU2MCatchHandlerFrame: 0e44ec30] <br />
Note that after I changed Dispatcher.Invoke to Dispatcher.BeginInvoke the problem basically resolved. I just want to know why it happenned. (If WPF Dispatcher framework... any issue...)
I also used Steve Johnson's SOSEX debugger - scan indicated Absence of deadlock!
Confused.
REF 1:
http://ewulf84.blogspot.hk/2011/12/using-syncblk-to-debug-hung-operation.html
http://stackoverflow.com/questions/508398/detecting-deadlocks-in-a-c-sharp-application
http://msdn.microsoft.com/en-us/magazine/cc163618.aspx#S4
REF 2 - WinDbg: http://msdn.microsoft.com/en-us/windows/hardware/gg463009/
REF 3 - WinDbg cheat sheet: http://geekswithblogs.net/.NETonMyMind/archive/2006/03/14/72262.aspx
REF 4 - Steve Johnson SOSEX Debugger extension: http://www.informit.com/articles/article.aspx?p=1583957 and http://www.stevestechspot.com/SOSEXV40NowAvailable.aspx)
dev
modified 27-Nov-12 1:58am.
|
|
|
|
|
Found the answer, share it here to dispel myth Dispatcher.Invoke buggy...
thread A background thread
<br />
lock(SomeSingleton)<br />
{<br />
LoadItems(..) --> This will trigger event "ItemsReloaded", and one UI thread handler handles this. Problem is, "SaveItems" button clicked after initial lock to SomeSingleton but before "ItemsReloaded" fired.<br />
}<br />
UI Thread handler for "ItemsLoaded":
<br />
...<br />
ItemsGrid.Dispatcher.Invoke( System.Windows.Threading.DispatcherPriority.Background,<br />
new Action(<br />
delegate()<br />
{<br />
}<br />
...<br />
Thread B (UI Thread)
void btnItemsSaved_Clicked(...)
{
lock(SomeSingleton) // Block by thread A, thus hanging UI thread.
{
// blocked indefinitely as Thread A cannot return until "ItemsLoaded" (thus its UI handler) is fired.
}
return;
}
Hope it helps.
What's INTERESTING though, is Windbg pointed me to lock statement in THREAD-A, whereas, if I attached Visual Studio debugger (with Intellitrace), it lead me straight to lock statement in THREAD-B
Also, in this situation, there's only one "SingletonLock" - not the textbox deadlock situation where you have lock(LockA) and lock(LockB) with two threads locking in reverse order.
dev
modified 29-Nov-12 20:23pm.
|
|
|
|
|
You may have only one lock instruction, but there is another lock.
The Invoke itself is a kind of lock. It will wait until the action finishes. That's why it dead-locks (and the BeginInvoke does not, as it does not wait).
|
|
|
|
|