I am working on this popup dialog and I am at the design stage:
I have three tristate checkboxes at the top and three group boxes with 4 checkboxes in each. The concept is simple:
If all 4 check boxes are ticked then the master checkbox is ticked.
If none of them are ticked then the master one is untickd.
If only 1 to 3 of them are ticked then the master one is set to intermediatery.
The user will be able to tick the master check box to bulk switch on all off all the associated checkboxes.
My question relates to the 3 static group boxes. I want those three lables changed into the 3 tri-state checkboxes as it will look nicer. When I played with WPF i had full control over how the labels looked for groupboxes but whatabout here in a MFC project?
This is the resource in my test project:
IDD_MFCAPPLICATION4_DIALOG DIALOGEX 0, 0, 309, 184
STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
EXSTYLE WS_EX_APPWINDOW
CAPTION "Assignment Slips"
FONT 8, "MS Shell Dlg", 0, 0, 0x1
BEGIN
DEFPUSHBUTTON "OK",IDOK,199,163,50,14
PUSHBUTTON "Cancel",IDCANCEL,252,163,50,14
CONTROL "Main hall",IDC_CHECK1,"Button",BS_AUTO3STATE | WS_TABSTOP,18,7,43,10
GROUPBOX "Main hall",IDC_STATIC,7,23,94,82
CONTROL "Bible Reading",IDC_CHECK2,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,17,38,59,10
CONTROL "Initial Call",IDC_CHECK3,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,17,53,47,10
CONTROL "First Return Visit",IDC_CHECK4,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,17,67,69,10
CONTROL "Bible Study",IDC_CHECK5,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,17,82,51,10
GROUPBOX "Aux. Class 1",IDC_STATIC,107,23,94,82
CONTROL "Bible Reading",IDC_CHECK6,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,117,38,59,10
CONTROL "Initial Call",IDC_CHECK7,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,117,53,47,10
CONTROL "First Return Visit",IDC_CHECK8,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,117,67,69,10
CONTROL "Bible Study",IDC_CHECK9,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,117,82,51,10
GROUPBOX "Aux. Class 2",IDC_STATIC,207,23,94,82
CONTROL "Bible Reading",IDC_CHECK10,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,217,39,59,10
CONTROL "Initial Call",IDC_CHECK11,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,217,53,47,10
CONTROL "First Return Visit",IDC_CHECK12,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,217,68,69,10
CONTROL "Bible Study",IDC_CHECK13,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,217,82,51,10
GROUPBOX "Other",IDC_STATIC,7,108,94,69
CONTROL "Opening Prayer",IDC_CHECK14,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,17,126,66,10
CONTROL "Closing Prayer",IDC_CHECK15,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,17,141,62,10
CONTROL "Aux. Class 1",IDC_CHECK18,"Button",BS_AUTO3STATE | WS_TABSTOP,117,7,56,10
CONTROL "Aux. Class 2",IDC_CHECK19,"Button",BS_AUTO3STATE | WS_TABSTOP,217,7,56,10
CONTROL "Congregation Bible Study",IDC_CHECK16,"Button",BS_AUTOCHECKBOX | BS_TOP | BS_MULTILINE | WS_TABSTOP,17,156,76,17
END
Update
One posibility is to adjust the design style like this:
That is quite clear and avoids the need for a checkbox as the label of the group box. But I would prefer the original approach if at all possible.
Update
Looking at this answer I cameup with a solution:
ScrollViewer can automatically add horizontal/vertical scrollbars for a given element. Now, I have an image wrapped inside zooming/panning control. I want to add scrollbars to the view containing this zooming control. When the image is fully visible, the scrollbars should be invisible. When 10% of the image is visible, the scrollbar thumb should occopy 1/10 of the scrollbar (standard behavior).
The problem here is that I want the ScrollViewer to occupy the area of the zooming control, and adapt its values using the image inside this control. Perhaps this can be done using some kind of binding to the child of the zooming control? Or maybe using two ScrollBar instances instead?
Zoomed out
+----------------+
| |
| +-------+ |
| | image | |
| +-------+ |
| |
+----------------+
Zoomed in
+----------------+
| |
| image sc <- adapting to visibleHeight/imageHeight
| ro
| ll
| |
+---- scroll ----+ <- adapting to visibleWidth/imageWidth
Sigh. Solved it using a ScrollViewer. I had to set the CanContentScroll to True...
I have a wpf TreeView with customized Items.
Each node is a wpf Border with a wpf expander inside. The expander contains the child items of the node, and so on. So every TreeViewNode has its items inside.
TreeViewItem: UI Representation:
the outer element: a wpf Border (the node):
/-----------------\
| |
| title(textbox) |
| |
| \/Expander |
| | | |
| | child | |
| | items | |
| ---------- |
| |
\-----------------/
The Viewmodel for the TreeViewItem has an ObservableCollection of further TreeviewItems.
If I add items using ObservableCollection<Item>.Add(..),
the TreeviewItem View shows the node with the new item: it enlarges the wpf Border and shows the new item inside the wpf Expander.
If I remove Items using ObservableCollectionyItem>.Remove(..), The Border shrinks again and shows an empty expander.
This is the behavior that I want to keep!
Problem: I used for the TextBox:
DockPanel.Dock = "Top"
to fit to the Border width. This stretches the TextBox to fit the new border width.
When I remove a child Item, the border won't get reduced in width, because the TextBox
is now larger. But I want the TextBoxto be independant from the outer border.
The TextBox should resize to the available space, when child items are added,
but should not influence the border from snapping back to a smaller size, when child items are removed.There should be no dependency from the TextBox width to any Layout elements.
How to achieve this?
example: If I use DockPanel.Dock="Left" for the textbox,
it will not grow (not good), but the border will snap back to its former size (good), when removing elements.
How can I make the width of the textbox not be relevant for the wpf automatic UI sizing ? By the way, I don't want to size the treeviewitems from code.
I found a very useful hint here:
stackoverflow.com/questions/6338315/allow-wpf-grid-cell-content-to-expand-outside-of-the-grid-cell
If you put the textbox inside a canvas, it won't influence the outer border width!